C 和 in C++ 关于"^="运算符的区别
Difference between C and in C++ regarding the "^=" operator
我想使用表达式交换int *x
和int *y
指向的值
*x ^= *y ^= *x ^= *y;
(嗯,我知道这个表达很尴尬,我只是想知道区别,没有冒犯。这在C++中有效,但在 C 中失败。但是,如果我将其分为三个部分,如下所示
*x ^= *y;
*y ^= *x;
*x ^= *y;
它适用于两种语言。
那么,C和C++中的运算符^=
有什么区别呢?
区别不在于您最初怀疑的指针,而在于评估规则的不同顺序。在"新"C++11"之前排序规则"中,我们有:
内置赋值运算符和所有内置复合赋值运算符的副作用(左参数的修改)在左参数和右参数的值计算(但不是副作用)之后排序,并在赋值表达式的值计算之前(即,在返回对修改对象的引用之前)排序
(来自CPPR。此规则保证对表达式进行所需的从右到左计算。
与此相反,C 和 C++98 使用"序列点"。由于 long 语句中没有序列点,因此对指针指向的值进行了多次未排序的修改,从而调用了未定义的行为。
对于 C,gcc 对此发出警告(现场)。对于 C++98,它显然已经使用了新规则,这很好,因为未定义的行为是未定义的。
拆分语句当然可以解决这个问题,因为语句的末尾明确地在需要序列点的位置引入了序列点。它也是优越的,因为它更具可读性,并且不需要知道排序规则来确定代码是否正确。
供参考:可以在此处找到C++中排序规则的精彩解释。
在单个语句中多次修改同一变量是未定义的行为,因此当您执行*x ^= *y ^= *x ^= *y
时,编译器可以执行任何操作。这与++i + i++
之类的总是错误的原因相同。
要回答上述问题:C 和 C++ 之间的原始指针没有区别。
但我认为你真正的问题是别的...
相关文章:
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 仅具有运算符()的结构和普通函数之间的实际区别
- 使用短运算符的字符串连接有区别吗?
- 运算符++();调用和++(*this)有什么区别?
- 你能帮我了解重载一元运算符和二进制运算符之间的区别吗?
- std::string [] 运算符和 at() 之间的区别
- 使用 insertion(<<) 运算符和 "write" 函数在 C++ 中显示数据有什么区别?
- C++ 字符串追加和运算符 += 之间的区别
- C++:调用运算符和调用其实现之间有区别吗
- 序列点和运算符优先级有什么区别
- 使用运算符读取文件和使用读取功能>>文件有什么区别?
- ->运算符和指针 * 之间的区别 (C++)
- "&&"运算符和"and"运算符之间的区别
- 显式运算符 = 调用和 = 运算符之间是否有区别
- 点运算符和箭头运算符之间的区别 结构对象变量 在 C 或 C++ 中创建树
- "++"运算符和"+= 1 "运算符有什么区别?
- 移动赋值运算符和移动构造函数之间的区别
- "new"运算符和"new"函数的区别
- C++数组运算符和 *(数组 + 索引)之间有什么区别(如果有)
- 赋值运算符和复制构造函数有什么区别?