为什么这段代码不能改变字符串?

时间:2016-10-07 15:05:22

标签: c string

我在C中查看字符串操作,我不明白为什么语句s1[i] = s1[++i];不会被第一个H替换为下一个字符{{1 }}。看看代码:

e

它打印#include <stdio.h> main() { char s1[] = "Hello world !"; for(int i = 0; s1[i] != '\0'; ++i) s1[i] = s1[++i]; printf("%s", s1); } 而不是Hello world !

2 个答案:

答案 0 :(得分:4)

您的计划有undefined behaviour,因为在此声明中

public synchronized void write (Connection connection, ByteBuffer buffer, Object object) {
   output.setBuffer(buffer);
   kryo.getContext().put("connection", connection);
   kryo.writeClassAndObject(output, object);
   output.flush();
}

public synchronized Object read (Connection connection, ByteBuffer buffer) {
   input.setBuffer(buffer);
   kryo.getContext().put("connection", connection);
   return kryo.readClassAndObject(input);
}

Connection connection = (Connection) kryo.getContext().get("connection"); 在序列点之间被修改两次(赋值运算符s1[i] = s1[++i]; 不会引入序列点)。

gcc(i)警告:

=
同样的铿锵警告说:

gcc -Wall -Wextra

答案 1 :(得分:2)

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

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

此警告的含义

C中没有规则说明应该首先评估作业的哪一侧。在这种情况下,似乎首先评估了右侧,但通常结果将是未定义的。