[C/C++] warning: multiple unsequenced modifications
在 C 语言中,当一个表达式中包含多个对同一个变量的修改(例如自增或自减操作),并且这些修改之间没有明确的顺序关系时,就会产生“未排序的修改”(unsequenced modification)问题。这种情况下,编译器无法保证这些修改发生的顺序,从而可能导致未定义行为(undefined behavior)。
为什么会出现未排序的修改?
在 C 语言中,复合表达式(如逗号表达式)中的各个部分的求值顺序是不确定的。具体来说,C 语言标准规定,如果一个表达式包含多个对同一个变量的修改,并且这些修改之间没有显式的顺序关系,那么这些修改就是未排序的。
为什么看起来是顺序的?
尽管在某些情况下,编译器可能会按照某种顺序执行这些操作,但这并不是标准所保证的。不同的编译器在不同的优化级别下可能会有不同的行为。因此,依赖于未定义的行为是危险的。
#include <stdio.h>
char buff[] = {0, 1, 2, 3, 4 ,5, 6, 7, 8};
int main()
{
printf("Hello, World! %#x %d %#x %d\n", buff[0], buff[0], buff[8], buff[8]);
for (int i = 0; i < sizeof(buff);) {
printf("%s %#x %#x %#x %#x %#x %#x %#x %#x\n", __func__,
buff[i++], buff[i++], buff[i++], buff[i++], buff[i++], buff[i++], buff[i++], buff[i++]);
printf("i = %d\n", i);
}
for (int i = 0; i < sizeof(buff); i+=8) {
printf("%s %#x %#x %#x %#x %#x %#x %#x %#x\n", __func__,
buff[i], buff[i+1], buff[i+2], buff[i+3], buff[i+4], buff[i+5], buff[i+6], buff[i+7]);
printf("i = %d\n", i);
}
return 0;
}
A 编译器
B 编译器
再牛逼的梦想也架不住傻逼似的坚持