我在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 !
答案 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中没有规则说明应该首先评估作业的哪一侧。在这种情况下,似乎首先评估了右侧,但通常结果将是未定义的。