gpt4 book ai didi

php - a = (a + b) - (b = a); C++ 与 PHP

转载 作者:可可西里 更新时间:2023-11-01 13:35:19 24 4
gpt4 key购买 nike

我一直在四处寻找并找到了公式: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

代码看起来一样但输出不同,我一直在思考两个原因:

  1. C++ 代码正在编译,php 正在解释。
  2. 这个公式是无用的,因为它会导致未定义的行为。

有人可以解释一下,为什么在这种情况下 C++ 和 php 的输出不同?

最佳答案

我不确定 PHP 中的规则是什么,但在 C++ 中,各个子表达式的顺序没有严格定义,或者用技术术语来说,它是“未指定的”——换句话说,允许编译器在执行 a + b 之前或之后计算 b = a。只要在减法之前执行 a + bb = 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 这样的解释语言中,创建一个新变量可能添加一些额外的开销,但与所需的逻辑中的额外工作相比,它不太可能那么大。

关于php - a = (a + b) - (b = a); C++ 与 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18040932/

24 4 0
文章推荐: php - 如何在 PHP 中截断小数点?
文章推荐: html - 如何在 IE 中删除空