2017-09-04 12 views
0

는이 같은 변수를 초기화합니다.상수 표현식에서 오류가 발생하지 않는 이유는 무엇입니까?</p> <pre><code>static int i = 2 * 2/0; </code></pre> <p>그런 다음, 컴파일러는 나에게 오류를 제공합니다 :

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

@Groo : 답변 섹션의 대답을 참조하십시오. – Bathsheba

+1

더 흥미로운 것은 'a || 2/0'은 에러를냅니다 ... –

답변

5

그것은 ||의 필수 단락 회로 평가와 표현이

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

22에 상당하는 표현이기 때문에로 평가된다는 사실 때문이다가, 2/0은 평가되지 않습니다.

+1

그리고 중요한 것은'||'등이 단락 될 것이라는 것입니다. – hyde