2016-05-26 69 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(); 
    } 
} 
相關問題