2016-10-07 5 views
0

Ich schaue auf String-Manipulation in C und ich verstehe nicht, warum die Anweisung s1[i] = s1[++i]; das erste H durch das nächste Zeichen e nicht ersetzen wird. Werfen Sie einen Blick auf den Code:Warum ändert dieser Code nicht die Zeichenfolge?

#include <stdio.h> 

main() 
{ 
    char s1[] = "Hello world !"; 
    for(int i = 0; s1[i] != '\0'; ++i) 
    s1[i] = s1[++i]; 
    printf("%s", s1); 
} 

Er druckt Hello world ! statt el r

+3

Weil 's1 [i] = s1 [++ i];' ist undefiniertes Verhalten. –

+0

@Phylogenesis Oh okay genial Ich dachte, dass ++ ich nur für s1 [++ i] nicht für die ganze Aussage zählte. – ChiseledAbs

+1

Mögliches Duplikat von [Sequenzpunkt im Array-Index] (http://stackoverflow.com/questions/37403357/sequence-point-in-array-index) –

Antwort

4

Ihr Programm hat undefined behaviour weil in dieser Aussage

s1[i] = s1[++i]; 

i modifiziert wird zweimal zwischen Sequenzpunkte (Zuweisungsoperator = führt keinen Sequenzpunkt ein).

gcc (gcc -Wall -Wextra) warnt mit:

warning: operation on ‘i’ may be undefined [-Wsequence-point] 

ähnlich Klirren warnt:

warning: unsequenced modification and access to 'i' [-Wunsequenced] 
+0

-Wextra ist nicht notwendig, um diese Warnung zu erhalten, ist aber immer noch ratsam. – jforberg

2
undef.c: In function ‘main’: 
undef.c:7:24: warning: operation on ‘i’ may be undefined [-Wsequence-point] 
      s1[i] = s1[++i]; 
         ^~~ 

Aktivieren Sie Ihre Compiler-Warnungen und achten Sie auf sie. Der Compiler ist dein Freund.

Was diese Warnung bedeutet:

Es gibt keine Regel in C Wort ist die Seite der Zuweisung sollte zuerst ausgewertet werden. In diesem Fall scheint es, dass die rechte Seite zuerst ausgewertet wurde, aber im Allgemeinen wird das Ergebnis undefiniert sein.

+0

Ich habe keine Warnmeldung mit 'cc' das ist seltsam. – ChiseledAbs

+0

@ChiseledAbs Welchen Compiler benutzen Sie? Stellen Sie sicher, dass Sie mit dem Flag -Wall oder dem entsprechenden Compiler ausgeführt werden (lesen Sie das Handbuch Ihres jeweiligen Compilers). Programmieren ohne Warnungen ist gefährlich und unnötig. – jforberg

Verwandte Themen