[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 编译器

posted @ 2024-10-15 17:21  壹点灵异  阅读(23)  评论(0编辑  收藏  举报