2014-10-05 81 views
1

當我在C中編寫程序時,遇到了一個問題。 & &不計算第二個操作數,如果第一個操作數爲假。我知道這被稱爲短路行爲。但我想要執行第二個操作數,請參閱下面的代碼以瞭解原因?C中的評估&&運算符

while(a-- && b--){ 
    //some statements 
} 

請告訴我不同​​的方式來完成我的任務。非常感謝!

+0

你期望看到什麼,你會得到什麼結果? – Pradheep 2014-10-05 03:45:29

+0

其實如果第一個操作數是假的,我也希望b的值應該遞減。但這並不是遞減。循環後必須使用遞減的b值。 – user3556306 2014-10-05 03:46:43

回答

2

如果a和b是足夠小,使得A * B不溢出:

while((a--) * (b--)) 
{...} 

如果他們能大:

while(((a--) ? 0xf : 0) & ((b--) ? 0xf : 0)) 
{...} 
+0

無法獲得你的第二個代碼? – user3556306 2014-10-05 03:52:13

+1

第二個版本將所有正數轉換爲0xf,然後執行按位&。所以如果(a--)和(b--)都是正數,那麼你得到0xf&0xf這就是0xf,所以循環繼續。如果其中任何一個爲0,那麼你得到0xf&0,它是零,循環停止。由於沒有短路,(a--)和(b--)都被評估。 – Ian 2014-10-05 03:55:06

1
while(a && b){ 
    a--; b--; 
    //some statements 
} 
// just after loop ends 
a--; b--; 
0

如果您需要後遞減b循環,爲什麼不首先保證評估?

while (b-- && a--) 

當然,這可能不是,如果ab都複雜得多,你的問題表明工作。

2

由於您使用的後綴減量,整個事情可以重寫爲

while (a && b) 
{ 
    --a; --b; 
    //some statements 
} 

--a; --b; 

(無論你真的很需要那最後一行是由你來決定。)

但是,如果你真的想爲了將所有東西都塞進這個while的條件,有不同的方法來實現這一點。例如,你可以用&操作,只要你記住,如果你想第二個操作數的執行atruefalse那麼你可以用逗號與!!

while(!!(a--) & !!(b--)){ 
    //some statements 
} 
1

「正常化」操作數代替&&運營商運營商。我認爲你需要這個:

while((b--, a--) && b) {...}