compiler-warnings - -Wsequence-point warning - 它是什么意思,它是否违反了 ANSI C 标准?

标签 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 的情况下交换这两个整数数组元素。程序仍然有效,但是可以吗?

最佳答案

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

问题是您评估并分配给 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;

关于compiler-warnings - -Wsequence-point warning - 它是什么意思,它是否违反了 ANSI C 标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40677318/

相关文章:

c++ - 将负文字作为无符号参数传递时,g++ 会发出警告吗?

javascript - 打乱图像 - Javascript

c - 函数无法在 c 中正确打印

c++ - 编译器不编译以下行 (C++)

c++ - 警告 : "Not all control paths return a value" c++

c - 意外的 C 行为

delphi - Delphi中的快速Swap64函数

java - 如何将数组列表中的特定项目移动到第一项

c - 用于 C 语言的基于 Flex/Bison 的词法分析器/解析器

在 C 中将大位字符串转换为十六进制