ST3*_*ST3 5 php c++ undefined-behavior
我一直在寻找并找到公式:a = (a + b) - (b = a)它应该交换两个变量(或某些情况下的对象).不过我用C++和php测试过,这些给了我不同的结果.
PHP:
$a = 10;
$b = 20;
$a = ($a + $b) - ($b = $a);
echo $a, " ", $b;
Run Code Online (Sandbox Code Playgroud)
这打印 20 10
C++
int a = 10;
int b = 20;
a = (a + b) - (b = a);
std::cout << a << " " << b;
Run Code Online (Sandbox Code Playgroud)
这打印 10 10
代码看起来一样但输出不同,我一直在考虑两个原因:
有人可以解释一下,为什么C++和php输出在这种情况下有所不同?
Mat*_*son 14
我不确定PHP中的规则是什么,但是在C++中,单个子表达式的顺序没有严格定义,或者作为技术术语,它是"未指定的" - 换句话说,允许编译器b = a在它之前或之后计算a + b.只要它a + b和b = a减法之前.使用"未指定"行为允许编译器在某些情况下生成更高效的代码,或者只是可以为某些体系结构构建编译器.
这也意味着如果你有一个表达式"重新计算"表达式本身的值,并在表达式的其他地方使用它,你会得到未定义的行为(简称UB).UB意味着这一点,行为没有定义 - 几乎任何事情都可能发生,包括你所看到的和许多其他选择(例如,编译器也允许产生42,即使逻辑说答案不会在这种情况下42 [这是错误的问题!]).
我还建议如果你想在PHP中交换两个值:
$t = $a;
$a = $b;
$b = $t;
Run Code Online (Sandbox Code Playgroud)
在C++中:
#include <algorithm>
std::swap(a, b);
Run Code Online (Sandbox Code Playgroud)
或者如果你坚持写自己的:
int t = a;
a = b;
b = t;
Run Code Online (Sandbox Code Playgroud)
试图聪明并且"没有临时变量"执行它几乎肯定会比使用临时变量更慢 - 当然在像C++这样的编译语言中 - 在像PHP这样的解释语言中,创建一个新的变量可能会增加一些额外的开销,但与所需逻辑的额外努力相比,它不太可能那么大.
| 归档时间: |
|
| 查看次数: |
808 次 |
| 最近记录: |