Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这段代码没有';你不能换绳子吗?_C_String - Fatal编程技术网

C 为什么这段代码没有';你不能换绳子吗?

C 为什么这段代码没有';你不能换绳子吗?,c,string,C,String,我正在研究C语言中的字符串操作,我不明白为什么语句s1[I]=s1[++I]不会用下一个字符e替换第一个H。看看代码: #include <stdio.h> main() { char s1[] = "Hello world !"; for(int i = 0; s1[i] != '\0'; ++i) s1[i] = s1[++i]; printf("%s", s1); } #包括 main() { char s1[]=“你好,世界!”; 对于(int i=0

我正在研究C语言中的字符串操作,我不明白为什么语句
s1[I]=s1[++I]
不会用下一个字符
e
替换第一个
H
。看看代码:

#include <stdio.h>

main()
{
  char s1[] = "Hello world !";
  for(int i = 0; s1[i] != '\0'; ++i)
    s1[i] = s1[++i];
  printf("%s", s1);
}
#包括
main()
{
char s1[]=“你好,世界!”;
对于(int i=0;s1[i]!='\0';++i)
s1[i]=s1[++i];
printf(“%s”,s1);
}
它打印
你好,世界
而不是
el r

您的程序在这条语句中

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]
您的程序在该语句中具有

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]
启用编译器警告并注意它们。编译器是你的朋友

此警告的含义

在C语言中没有规则规定应该首先评估作业的哪一边。在这种情况下,似乎是首先对右侧进行求值,但通常结果是未定义的

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

此警告的含义


在C语言中没有规则规定应该首先评估作业的哪一边。在这种情况下,似乎是首先对右侧进行求值,但通常结果将是未定义的。

因为
s1[i]=s1[++i]是未定义的行为。@Phylogenesis哦,好吧,太棒了,我认为++I只对s1[++I]重要,而不是对整个语句。可能是@XING的重复,并且将与原始语句一样未定义。因为
s1[I]=s1[++I]是未定义的行为。@Phylogenesis哦,好吧,太棒了,我认为++我只对s1[++I]重要,对整个语句不重要。可能是@XING的重复,并且将与原始的一样未定义。我没有关于
cc
的警告消息,这很奇怪。@screedabs你在使用哪种编译器?确保使用-Wall标志或编译器的等效标志运行(请参阅特定编译器的手册)。没有警告的编程是危险和不必要的。我没有带有
cc
的警告消息,这很奇怪。@screedgedabs您使用的是哪种编译器?确保使用-Wall标志或编译器的等效标志运行(请参阅特定编译器的手册)。没有警告的编程是危险和不必要的。-Wextra没有必要获得此警告,但仍然是可取的。-Wextra没有必要获得此警告,但仍然是可取的。