2017-09-04 48 views
0

如果我初始化這樣的變量:爲什麼常量表達式不給出錯誤?

static int i = 2 * 2/0; 

然後,編譯器給我一個錯誤。

prog.c: In function 'main': 
prog.c:5:23: warning: division by zero [-Wdiv-by-zero] 
    static int i = 2 * 2/0; 
        ^
prog.c:5:17: error: initializer element is not constant 
    static int i = 2 * 2/0; 

但是,如果我使用||代替*,像這樣:

static int i = 2 || 2/0; 

那麼它的成功編譯。

根據Operator Precedence,優先*高於||。所以,首先2/0操作評估。我對嗎?

那麼,爲什麼不static int i = 2 || 2/0;給出錯誤?

+4

'||'是短路的,所以表達式的第二部分根本不被評估。 – Groo

+3

@格魯:請在答案部分的答案。 – Bathsheba

+1

更有意思的是詢問是否a || 2/0'給出一個錯誤... –

回答

5

這是由於||強制短路評價和您的表達式作爲

static int i = (2 || (2/0)); 

由於2等於2一個表情評估的事實,2/0不評估。

+1

重要的細節是''''等*是保證*是短路。 – hyde

相關問題