Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C和C中的差异++;关于"^=&引用;操作人员_C++_C_Assignment Operator - Fatal编程技术网

C++ C和C中的差异++;关于"^=&引用;操作人员

C++ C和C中的差异++;关于"^=&引用;操作人员,c++,c,assignment-operator,C++,C,Assignment Operator,我想用表达式交换int*x和int*y指向的值 *x ^= *y ^= *x ^= *y; (好吧,我知道这个表达很尴尬,我只是想知道区别,无意冒犯。) 这在C++中工作,但是C中失败了,但是如果我把它分成三个部分,比如下面的< /P> *x ^= *y; *y ^= *x; *x ^= *y; 它适用于两种语言 < C++ > C++中的操作符 ^=/COD>有什么不同,回答了上述问题:C和C++之间的原始指针没有区别。 但我认为你真正的问题是另外一件事…在一条语句中多次修改同一个变量是未

我想用表达式交换
int*x
int*y
指向的值

*x ^= *y ^= *x ^= *y;
(好吧,我知道这个表达很尴尬,我只是想知道区别,无意冒犯。) 这在C++中工作,但是C中失败了,但是如果我把它分成三个部分,比如下面的< /P>
*x ^= *y;
*y ^= *x;
*x ^= *y;
它适用于两种语言


< C++ > C++中的操作符<代码> ^=/COD>有什么不同,回答了上述问题:C和C++之间的原始指针没有区别。
但我认为你真正的问题是另外一件事…

在一条语句中多次修改同一个变量是未定义的行为,因此编译器可以在执行
*x^=*y^=*x^=*y
时执行任何操作。这也是为什么
++i+i++
或类似的东西总是错误的原因。

不同之处不在于你最初怀疑的指针,而在于不同的求值规则顺序。在“新的”C++11“规则之前排序”中,我们有:

内置赋值运算符和所有内置复合赋值运算符的副作用(修改左参数)在左参数和右参数的值计算(但不是副作用)之后排序,并在赋值表达式的值计算之前排序(即,在返回对修改对象的引用之前)

(From.)此规则保证对表达式进行所需的从右到左的计算

与此相反,C和C++98使用“序列点”。由于长语句中没有序列点,指针指向的值有多个未排序的修改,因此调用未定义的行为

对于C,gcc对此发出警告。对于C++98,它显然已经使用了新的规则,这很好,因为未定义的行为是未定义的

当然,拆分语句可以解决这个问题,因为语句的结尾会显式地在需要的地方引入序列点。拆分语句也更具优势,因为它更具可读性,而且不需要知道序列规则来确定代码是否正确



<>参考文献:对C++中的排序规则有一个很好的解释。−1我在“*x^=*y^=*x^=*y;”停止阅读。如果你要问一个问题,请给出不那么令人厌恶的代码。谢谢。@cheers-sandhth.-Alf恐怕这条令人厌恶的线就是问题的最终目的。不确定为什么会投反对票?这个问题提供了重现错误的工作代码。没有多少提问者会这样做。这也暴露了
C之间有趣的区别<现在,我们是否会因为代码势利而被否决?你还应该考虑在C和C++之间添加实际的差异,包括例子,再对问题进行分析。C是UB,这是问题。“为什么这不能在C++中工作?”旁注
++i+i++或类似的东西总是错误的
是假的,根据标准它是UB。我的意思是,它从来不是你想要做的。不过,我可以看出我是如何被误解的。顺便说一句,“在一条语句中多次修改同一变量是未定义的行为”甚至在C和C++98中都不是这样,
++x,++x;
是一个单独的语句,但不是UB,因为逗号引入了一个序列点。很好地指出,+1。但请注意,这只回答了当前的问题,而不是关于指针的原始问题。如果您可以为序列点的标准和e面提供更详细的注释,可能会更好因此,对于像我这样的初学者来说,阅读更多关于这方面的内容可能会有所帮助。以下是一篇相关文章:@吴俣铖 我不认为完整的排序解释在这个答案的范围内,我不喜欢不完整的解释。因此,我将包括你评论中的链接作为参考,如果你找到一个C的好链接,请随意添加。投票结果是因为这是唯一一个解决原始问题的答案。你的假设是正确的,在首先,我认为这是一个指针问题,在阅读了答案后,我发现它更可能与评估顺序有关,或者与我不太了解的序列点和副作用有关。