2016-05-26 6 views
1

Ich versuche, Fizzbuzz in D arbeiten zu arbeiten, aber ich habe keine Ahnung für das Leben von mir, was das Problem ist. Ich habe versucht, die Logik umzukehren, und es schreibt beide Wörter, wenn es nicht passend ist, aber wenn es nur nichts schreibt.FizzBuzz in Dlang

Hier ist ein Screenshot von dem, was die Ausgabe wie folgt aussieht: http://puu.sh/p67Hd/2a5a598b1b.png

import std.stdio; 

void main() { 
    for (uint i = 0; i < 100; i++) { 
     if (i%5 && i%3) write(i); 
     if (!i%3) write("Fizz"); 
     if (!i%5) write("Buzz"); 
     writeln(); 
    } 
} 
+1

https://www.rosettacode.org/wiki/FizzBuzz#D –

+0

Ich bin kein 'D' Typ Klammer um die % Operationen hinzufügen, aber Ich denke, '!' Ist bindender als '%'; füge ein paar Klammern hinzu – vu1p3n0x

Antwort

3

Der ! Operator hat Vorrang vor % so aussehen Ihre if Aussagen wie

if ((!i) % 3) write("Fizz"); 
if ((!i) % 5) write("Buzz"); 

und weil alle i

nicht Null ist (neben dem ersten Mal), !i ist immer 0 und 0 % 5 und 0 % 3 ist immer 0 (false).

zu beheben, alles, was Sie tun müssen, ist

if (!(i % 3)) write("Fizz"); 
if (!(i % 5)) write("Buzz"); 
3

Der Grund für die operator precedence in D ist.

Die if(!i%3) wird tatsächlich als if((!i)%3) interpretiert, was entweder 0% 3 ergibt (was falsch ist) oder 1% 3 (was richtig ist). !n ergibt 1 wenn n 0 ist, sonst wird es immer 0 sein. Da es von 0 bis 100 geht, ist (!i) % 3 nur einmal am Anfang wahr. Aus diesem Grund gibt es am Anfang der Ausgabe einen FizzBuzz.

Anstatt Code sollte wie folgt aussehen:

import std.stdio; 

void main() { 
    for (uint i = 0; i < 100; i++) { 
     if (i%5 && i%3) write(i); 
     if (!(i%3)) write("Fizz"); 
     if (!(i%5)) write("Buzz"); 
     writeln(); 
    } 
} 
Verwandte Themen