我环顾四周,发现了公式:a = (a + b) - (b = a)
它应该交换两个变量(或某些情况下的对象)。然而我用 C++ 和 php 测试了它,这些给了我不同的结果。
php:
$a = 10;
$b = 20;
$a = ($a + $b) - ($b = $a);
echo $a, " ", $b;
这打印20 10
C++
int a = 10;
int b = 20;
a = (a + b) - (b = a);
std::cout << a << " " << b;
这打印10 10
代码看起来相同但输出不同,我一直在思考两个原因:
- C++ 代码正在编译,php 正在解释。
- 这个公式没有用,因为它会导致未定义的行为。
有人可以解释一下,为什么 C++ 和 php 输出在这种情况下不同?
我不确定 PHP 中的规则是什么,但在 C++ 中,各个子表达式的顺序没有严格定义,或者用技术术语来说,它是“未指定的”——换句话说,编译器是允许的计算b = a
之前或之后a + b
。只要它做到了a + b
and b = a
减法之前。使用“未指定”行为允许编译器在某些情况下生成更有效的代码,或者简单地说可以为某些体系结构构建编译器。
这还意味着,如果您有一个表达式“重新计算”表达式本身内的值,并且也在表达式的其他位置使用它,则会出现未定义的行为(简称 UB)。 UB 的意思就是,行为没有定义 - 几乎任何事情都可能发生,包括你所看到的和许多其他替代方案(例如,编译器也被允许生成 42 作为结果,即使逻辑表明答案不会是42 在这种情况下[这是一个错误的问题!])。
我还建议如果你想在 PHP 中交换两个值:
$t = $a;
$a = $b;
$b = $t;
在 C++ 中:
#include <algorithm>
std::swap(a, b);
或者如果您坚持自己编写:
int t = a;
a = b;
b = t;
尝试聪明地“不使用临时变量”执行它几乎肯定会比使用临时变量慢 - 当然在像 C++ 这样的编译语言中 - 在像 PHP 这样的解释语言中,创建一个新变量可能会增加一点额外的开销,但与所需的逻辑上的额外工作相比,它不太可能那么大。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)