2013-09-02 22 views
5

Mein Compiler warnt: operation on j may be undefinedIst das nicht definiert?

Hier ist der Code C:

for(int j = 1; pattern[j] != '\0' && string[i] != '\0';){ 
    if(string[i+j] != pattern[j++]){//this is on the warning 
     found = 0; 
     break; 
    } 
} 

Ist das nicht definiert?

+4

Wo wird 'i' deklariert/initialisiert? –

+3

@MartinJames Das ist irrelevant. – nos

+1

Sie könnten [diese Frage] (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points?rq=1) eine interessante Lektüre finden. – WhozCraig

Antwort

10

JA. string[i+j] != pattern[j++] hat zwei verschiedene Ausführungen basierend auf der Variablen j ohne sequence point dazwischen. So ist es ein Beispiel für undefined behaviour.

+0

Die [Seite] (http: // www. geeksforgeeks.org/sequence-points-in-c-set-1/), die du angefordert hast, ist jetzt verfügbar_ :-) –

2

Ja. Der C11-Standard sagt in § 6.5:

If a side effect on a scalar object is unsequenced relative to either a different 
side effect on the same scalar object or a value computation using the value of the 
same scalar object, the behavior is undefined. If there are multiple allowable 
orderings of the subexpressions of an expression, the behavior is undefined if such 
an unsequenced side effect occurs in any of the orderings. 

Hier, im Vergleich

if(string[i+j] != pattern[j++]) 

Sie sowohl den Wert von j mit pattern [j++] erhöht wird, und mit dem Wert von j in string [i + j]. Der Nebeneffekt von j++ ist nicht in Bezug auf die Wertberechnung i + j sequenziert. Das ist klassisches undefiniertes Verhalten.