a=(a+b)-(b=a);C++与php的比较
a = (a + b) - (b = a); C++ vs php
我四处寻找,发现公式: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++中,各个子表达式的顺序并没有严格定义,或者正如技术术语所说,它是"未指定的"——换句话说,编译器可以在计算a + b
之前或之后计算b = a
。只要它在减法之前执行a + b
和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;
尝试巧妙地在"没有临时变量"的情况下执行它几乎肯定会比在PHP等解释语言中使用临时变量(当然是在C++等编译语言中)慢,创建一个新变量可能会增加一些额外的开销,但与所需逻辑的额外工作量相比,它不太可能那么大。
C++代码由于未定义的行为而被完全破坏。(在一个序列点中读取和写入b
)。
对于PHP:
$a = 10;
$b = 20;
$a = ($a + $b) - ($b = $a);
//executes like thus
$a = (30) - ($b = $a);
$a = (30) - ($b = $a = 10); //new $a still not computed, using older $a
$a = (30) - (10);
$a = 20;
//then, $a=20 and $b = 10
这完全与运算符优先级有关,这在C中可能相同,也可能不同,如果没有发生意外行为,则取决于优先级。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- C++自定义比较函数
- 如何比较自定义类的std::变体
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- std::设置自定义比较器
- 布尔比较运算符是如何在C++中工作的
- C++将目录中的所有文件与::filesystem进行比较
- shell排序中的交换和比较
- 如何在C++中比较两个char数组
- catch框架有没有办法比较流或文件
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 智能指针作为无序映射键,并通过引用进行比较
- 比较if语句中的数组值和int值
- C++按字符串调用函数,比较PHP的性能,如何在C++中优化代码
- 算法实现与 C++ 和 PHP 进行比较
- a=(a+b)-(b=a);C++与php的比较