當我在C中編寫程序時,遇到了一個問題。 & &不計算第二個操作數,如果第一個操作數爲假。我知道這被稱爲短路行爲。但我想要執行第二個操作數,請參閱下面的代碼以瞭解原因?C中的評估&&運算符
while(a-- && b--){
//some statements
}
請告訴我不同的方式來完成我的任務。非常感謝!
當我在C中編寫程序時,遇到了一個問題。 & &不計算第二個操作數,如果第一個操作數爲假。我知道這被稱爲短路行爲。但我想要執行第二個操作數,請參閱下面的代碼以瞭解原因?C中的評估&&運算符
while(a-- && b--){
//some statements
}
請告訴我不同的方式來完成我的任務。非常感謝!
如果a和b是足夠小,使得A * B不溢出:
while((a--) * (b--))
{...}
如果他們能大:
while(((a--) ? 0xf : 0) & ((b--) ? 0xf : 0))
{...}
無法獲得你的第二個代碼? – user3556306 2014-10-05 03:52:13
第二個版本將所有正數轉換爲0xf,然後執行按位&。所以如果(a--)和(b--)都是正數,那麼你得到0xf&0xf這就是0xf,所以循環繼續。如果其中任何一個爲0,那麼你得到0xf&0,它是零,循環停止。由於沒有短路,(a--)和(b--)都被評估。 – Ian 2014-10-05 03:55:06
while(a && b){
a--; b--;
//some statements
}
// just after loop ends
a--; b--;
如果您需要後遞減b
循環,爲什麼不首先保證評估?
while (b-- && a--)
當然,這可能不是,如果a
和b
都複雜得多,你的問題表明工作。
由於您使用的後綴減量,整個事情可以重寫爲
while (a && b)
{
--a; --b;
//some statements
}
--a; --b;
(無論你真的很需要那最後一行是由你來決定。)
但是,如果你真的想爲了將所有東西都塞進這個while
的條件,有不同的方法來實現這一點。例如,你可以用&
操作,只要你記住,如果你想第二個操作數的執行a
是true
或false
那麼你可以用逗號與!!
while(!!(a--) & !!(b--)){
//some statements
}
「正常化」操作數代替&&
運營商運營商。我認爲你需要這個:
while((b--, a--) && b) {...}
你期望看到什麼,你會得到什麼結果? – Pradheep 2014-10-05 03:45:29
其實如果第一個操作數是假的,我也希望b的值應該遞減。但這並不是遞減。循環後必須使用遞減的b值。 – user3556306 2014-10-05 03:46:43