2017-09-04 7 views
0

Wenn ich Variable wie folgt initialisiert:Warum gibt ein konstanter Ausdruck keinen Fehler?

static int i = 2 * 2/0; 

Dann Compiler mir einen Fehler geben.

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; 

Aber, wenn ich || statt * wie folgt verwenden:

static int i = 2 || 2/0; 

dann ist es erfolgreich kompiliert.

Gemäß Operator Precedence, Vorrang von * höher als ||. Also, zuerst 2/0 Operation ausgewertet. Habe ich recht?

Also, warum gibt static int i = 2 || 2/0; einen Fehler nicht?

+4

'||' ist kurzgeschlossen, daher wird der zweite Teil des Ausdrucks überhaupt nicht ausgewertet. – Groo

+3

@Groo: Antworten im Bereich Antworten bitte. – Bathsheba

+1

Interessanter ist zu fragen, ob 'a || 2/0' gibt einen Fehler ... –

Antwort

5

Es ist aufgrund der obligatorischen Bewertung Kurzschluss || und die Tatsache, dass Ihr Ausdruck als

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

Da 2 ein Ausdruck gleich 2 ist, wird 2/0 nicht ausgewertet wird ausgewertet.

+1

Und wichtiges Detail ist, '||' usw. sind * garantiert * kurzgeschlossen. – hyde

Verwandte Themen