2016-05-26 36 views
1

我正在尝试在D中使用fizzbuzz,但我不知道问题出在哪里。我尝试了逆转逻辑,当它不合适时它会写出两个词,但是当它不是什么都不写时。Dlang的FizzBu​​zz

这里是什么样的输出看起来像截图: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/FizzBu​​zz#D –

+0

我没有'D'的家伙,但我猜'''比'%'更具有约束力;添加一些括号 – vu1p3n0x

回答

3

!操作的优先级高于%所以你if语句看起来像

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

因为所有的i是非零(除了第一次),!i总是00 % 50 % 3总是0 (false)

要解决,所有你需要做的是周围添加%操作括号

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

原因是operator precedence in D

if(!i%3)实际上将被解释为if((!i)%3),其结果为0%3(这是假的)或1%3(这是真的)。如果n为0,则!n将导致1,否则它将始终为0.因为它将从0到100,所以(!i) % 3只会在开始时为真。这就是为什么在输出开始时有一个FizzBu​​zz的原因。

因此,而不是你的代码应该是这样的:

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(); 
    } 
} 
相关问题