- 后果点警告 - 它是什么意思,是否违反了ANSI C标准?

时间:2016-11-18 12:36:21

标签: compiler-warnings swap ansi-c

排队

tab[i] = tab[i+1] - tab[i] + (tab[i+1] = tab[i]);

我有警告

[Warning] operation on '*(tab + ((sizetype)i + 1u) * 4u)' may be undefined [-Wsequence-point]

我想交换这两个整数数组元素而没有临时变量而且没有违反ANSI C.程序仍然可以工作,但是可以吗?

1 个答案:

答案 0 :(得分:3)

您的代码依赖于标准未涵盖的行为。因此,您的代码在不同的编译器,同一编译器的不同版本上的行为可能会有所不同,甚至根据周围的代码表现不同。

问题是您在没有分离序列点的情况下评估并分配给tab[i+1]。您似乎很明显,您的程序将从左到右执行计算,但C标准不要求这样做。编译器可以将代码编译为:

tab[i+1] = tab[i];
tab[i] = tab[i+1] - tab[i] + tab[i+1];

作为单独的说明。交换两个变量是一个高度优化且易于识别的操作,如果你写的话,任何优化编译器都会选择最快的指令:

int temp = tab[i];
tab[i] = tab[i+1];
tab[i+1] = temp;