我最近注意到,下面的表達式在我的編譯器(鏘)編譯:複合條件:如果(0.0 <α<1.0)
float a;
if (0.0 < a < 1.0) { ... }
這是否做什麼,我期待?我期望它相同的計算結果爲這個條件:
if (0.0 < a && a < 1.0) { ... }
如果是這樣,因爲當和與其他編譯器就可以編寫條件在這短短的形式?
我最近注意到,下面的表達式在我的編譯器(鏘)編譯:複合條件:如果(0.0 <α<1.0)
float a;
if (0.0 < a < 1.0) { ... }
這是否做什麼,我期待?我期望它相同的計算結果爲這個條件:
if (0.0 < a && a < 1.0) { ... }
如果是這樣,因爲當和與其他編譯器就可以編寫條件在這短短的形式?
由於<
操作者的表達條件(0.0 < a < 1.0)
的左到右結合的裝置((0.0 < a) < 1.0)
== 1 < 1.0
或0 < 1.0
取決於a
值。
所以不行,它與if (0.0 < a && a < 1.0)
不一樣(也許你可能會對Python的同情規則感到困惑),但是在C語言中,它將如我上面所解釋的那樣相互滲透。
您可以在例如觀察的差別--- 0.0 < a < 1.0
== true
時a
== 0.0
,那裏的(0.0 < a && a < 1.0)
== false,那麼a
== 0.0
,下面是我的代碼(閱讀評論):
#include<stdio.h>
void print_(int c){
c ? printf("True \n"):
printf("False \n");
}
int main(void){
float a = 0.0f;
print_(0.0f < a < 1.0f); // 0.0 < 0.0 < 1.0f == 0 < 1.0f == True
print_(0.0f < a && a < 1.0f); // 0.0f < 0.0f && ... == False && ... = False
return 0;
}
輸出:
True
False
檢查其工作@Ideone
這是否做什麼,我期待?
不,因爲它很簡單。<
運營商是有一個left to right
associativity
檢查它在第二種形式如下
(0.0 < a < 1.0) is simply
(0.0 < a) < 1.0
int main()
{
float a = 8.4;
if (0.0 < a && a < 9) //same as (0.0 < a) && (a < 9)
printf("x");
}
O/P = X
示例程序爲+1 – 0decimal0
也許我們可以這樣想(只是爲了好玩):
if(0.0 <a < 1.0)
==>
if((0.0 <a)<1.0)
認爲:
如果0.0 < a == true
,然後(true <1.0) == false
!
否則,如果0.0 < a == false
,則(false <1.0) == true
!
所以我能翻譯if(0.0 <a <1.0)
到if(!(0.0<a))
有趣,不是嗎?
謝謝大家,但不要+1時間相同的答案:) – MrTJ
不客氣,但不要發佈+1時間相同的問題... – 2013-07-26 10:41:23
[Chaining Bool值可能相同的結果相反的結果到預期](http://stackoverflow.com/questions/5939077/chaining-bool-values-give-opposite-result-to-expected) – 2013-07-26 10:42:14