gpt4 book ai didi

c++ - 为什么 a = (a+b) - (b=a) 是交换两个整数的错误选择?

转载 作者:IT老高 更新时间:2023-10-28 13:22:25 24 4
gpt4 key购买 nike

我偶然发现了这段代码,用于在不使用临时变量或按位运算符的情况下交换两个整数。

int main(){

int a=2,b=3;
printf("a=%d,b=%d",a,b);
a=(a+b)-(b=a);
printf("\na=%d,b=%d",a,b);
return 0;
}

但我认为此代码在交换语句 a = (a+b) - (b=a); 中具有未定义的行为,因为它不包含任何 序列点 确定评估顺序。

我的问题是:这是交换两个整数的可接受解决方案吗?

最佳答案

没有。这是 Not Acceptable 。此代码调用 Undefined behavior .这是因为 b 上的操作没有定义。在表达式中

a=(a+b)-(b=a);  

由于缺少 sequence point,不确定是先修改 b 还是将其值用于表达式 (a+b) .
看看什么标准的syas:

C11:6.5 表达式:

If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalarobject, the behavior is undefined. If there are multiple allowable orderings of thesubexpressions of an expression, the behavior is undefined if such an unsequenced sideeffect occurs in any of the orderings.84)1.

阅读 C-faq- 3.8这个answer有关序列点和未定义行为的更详细说明。


<子>1。重点是我的。

关于c++ - 为什么 a = (a+b) - (b=a) 是交换两个整数的错误选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20800684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com