2013-07-26 15 views
3

我最近注意到,下面的表達式在我的編譯器(鏘)編譯:複合條件:如果(0.0 <α<1.0)

float a; 
if (0.0 < a < 1.0) { ... } 

這是否做什麼,我期待?我期望它相同的計算結果爲這個條件:

if (0.0 < a && a < 1.0) { ... } 

如果是這樣,因爲當和與其他編譯器就可以編寫條件在這短短的形式?

+0

謝謝大家,但不要+1時間相同的答案:) – MrTJ

+2

不客氣,但不要發佈+1時間相同的問題... – 2013-07-26 10:41:23

+1

[Chaining Bool值可能相同的結果相反的結果到預期](http://stackoverflow.com/questions/5939077/chaining-bool-values-give-opposite-result-to-expected) – 2013-07-26 10:42:14

回答

12

由於<操作者的表達條件(0.0 < a < 1.0)的左到右結合的裝置((0.0 < a) < 1.0) == 1 < 1.00 < 1.0取決於a值。

所以不行,它與if (0.0 < a && a < 1.0)不一樣(也許你可能會對Python的同情規則感到困惑),但是在C語言中,它將如我上面所解釋的那樣相互滲透。

您可以在例如觀察的差別--- 0.0 < a < 1.0 == truea == 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

+1

+1有關的蟒蛇。 – pradipta

+1

接受去首先到達 – MrTJ

+0

@MTTJ謝謝!在這裏等待..... –

10

這是做我所期望的嗎?

不,它

(0.0 < a) < 1.0 

(0.0 < a)產量01。所以你最終有0 < 1.01 < 1.0評估。

請注意,在其他一些語言中,它會按照您的預期進行操作。

例如在Python,

a < b < c 

被稱爲鏈比較和它等價於:

(a < b) and (b < c) 
+0

...此外,'0 <1.0'評估爲'1',而'1 <1.0'評估爲'0',因此完整表達式等同於'!(0.0 caf

3

這是否做什麼,我期待?

不,因爲它很簡單。<運營商是有一個left to rightassociativity檢查它在第二種形式如下

(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

示例程序爲+1 – 0decimal0

1

也許我們可以這樣想(只是爲了好玩):

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))

有趣,不是嗎?