2016-10-07 71 views
0

我正在看C中的字符串操作,我不明白为什么陈述s1[i] = s1[++i];不会替换第一个H下一个字符e。看看代码:为什么这段代码不会改变字符串?

#include <stdio.h> 

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

它打印出的el rHello world !代替

+3

因为's1 [i] = s1 [++ i];'是未定义的行为。 –

+0

@Phylogenesis哦好吧真棒我认为,++我只关心s1 [++ i]不是为了整个声明。 – ChiseledAbs

+1

[数组索引中的序列点]的可能重复(http://stackoverflow.com/questions/37403357/sequence-point-in-array-index) –

回答

4

你的程序有undefined behaviour,因为在此声明

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

i的序列点(赋值运算符之间修改了两次=没有引入序列点)。

GCC(gcc -Wall -Wextra)与警告说:

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

同样铛警告:

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

-Wextra不需要获取此警告,但仍然是可取的。 – jforberg

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

启用编译器警告和注意他们。编译器是你的朋友。

这是什么警告表示

在C中说不规则,转让方应首先评估。在这种情况下,似乎右边碰巧是先评估的,但总的来说结果是未定义的。

+0

我没有'cc'的警告信息,这很奇怪。 – ChiseledAbs

+0

@ChiseledAbs您正在使用哪种编译器?确保您正在使用-Wall标志运行,或者与您的编译器等效(请参阅特定编译器的手册)。没有警告的编程是危险的和不必要的。 – jforberg

相关问题