Try*_*ard 0 c expression operator-precedence sequence-points
我找到了以下代码片段:
#include <stdio.h>
int main(void) {
int x=10,y=15;
x=x+y-(y=x);
printf("x=%d y=%d",x,y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它实际上交换了变量
任何人都可以解释一下代码如何交换变量?
我认为括号将首先执行然后表达式导致
x=x+y-y;
Run Code Online (Sandbox Code Playgroud)
此算法不起作用,因为它在此行上调用未定义的行为:
x=x+y-(y=x);
^ ^
Run Code Online (Sandbox Code Playgroud)
您正在y根据6.5C99标准草案的相应部分在相同的序列点中修改并使用其值:
在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的计算来修改一次.72)此外,先前的值应该是只读的,以确定要存储的值.73)
由于未指定子表达式的评估顺序,因此还存在未指定行为的问题:
运算符和操作数的分组由语法表示.74)除了稍后指定的(对于函数调用(),&&,||,?:和逗号运算符),子表达式的评估顺序和顺序发生哪些副作用都是未指明的.
在这种情况下,如果您使用clang它将提供以下警告:
warning: unsequenced modification and access to 'y' [-Wunsequenced]
x=x+y-(y=x);
~ ^
Run Code Online (Sandbox Code Playgroud)
据我所知,默认情况下.您可以gcc通过使用收到类似的警告-Wall.
有几个SO问题涵盖了如何在没有临时交换的情况下进行交换,例如在不使用第三个变量的情况下交换两个变量值.
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |