2014-08-28 121 views
1

在下面的代碼中,當我獲取第一個if的條件的值時,它是0,因此是錯誤的。仍然,輸出打印「浮動」。這是短路的結果嗎?如果是這樣,爲什麼在「正常」情況下不會發生這種情況,sizeof運算符未與'=='一起使用?條件運算符

#include<stdio.h> 
int main() 
{ 
    int x=1; 
    short int i=2; 
    float f=3; 

    if(sizeof((x == 2) ? f : i) == sizeof(float)) 
     printf("float"); 
    else if(sizeof((x == 2) ? f : i) == sizeof(short int)) 
     printf("Short int"); 
} 

回答

0

問題是sizeof((x==2)?f:i)返回其參數的靜態類型的大小。它的論點是(x==2)?f:i,即使條件不成立,也是float。這是因爲表達式類型不是在運行時設置的,而是在編譯期間。

3

無論選擇哪個操作數,operator?:的結果必須是相同的類型。在這種情況下,第一個?:結果i轉換爲float,所以尺寸與float的尺寸相同。

我們可以看到在§6.5.15/ 5確定所述類型的精確的方法:

如果兩個第二和第三運算數具有算術類型,則結果類型,這將是 通過通常的測定算術轉換,是否應用於這兩個操作數, 是結果的類型。

跳過到常見算術轉換,中的有關內容在§6.3.1.8/ 1:

否則,如果對應的真實類型有一個操作數的是浮子,其他 操作數轉換,而不改變域的類型,以相應的實型爲float的類型。

你有它。

3

sizeof不會執行它的操作數,而且是一個編譯時操作符,這意味着無論如何您都不能在非常量值上進行分支。

sizeof((x == 2) ? f : i)(x == 2) ? f : i的結果類型的大小。如果條件運算符被執行,條件運算符會將short提升爲float,因此整個sizeof表達式等效於sizeof(float)

+0

沒有促銷,只有UAC。 – chris 2014-08-28 12:41:32

+1

*您需要管理員權限才能執行此分支*。啊。 – Quentin 2014-08-28 12:46:45

+0

哈。我仍在努力在Windows之前將它與C++聯繫起來。 – chris 2014-08-28 12:47:27