相关疑难解决方法(0)

未定义的行为和序列点

什么是"序列点"?

未定义的行为和序列点之间的关系是什么?

我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?

如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ c++-faq undefined-behavior sequence-points

970
推荐指数
4
解决办法
10万
查看次数

为什么这个语句不适用于java x ^ = y ^ = x ^ = y;

int x=1;
int y=2;
x ^= y ^= x ^= y;
Run Code Online (Sandbox Code Playgroud)

我期待值被交换.但它给出x = 0和y = 1.当我尝试使用C语言时,它会给出正确的结果.

java swap xor undefined-behavior

14
推荐指数
2
解决办法
2851
查看次数

表达式中有序列点a ^ = b ^ = a ^ = b,还是未定义?

据称"巧妙"(但实际上效率低下)交换两个整数变量而不是使用临时存储的方式通常涉及这一行:

int a = 10;
int b = 42;

a ^= b ^= a ^= b; /*Here*/

printf("a=%d, b=%d\n", a, b); 
Run Code Online (Sandbox Code Playgroud)

但我想知道,复合赋值运算符^=不是序列点,是吗?这是否意味着它实际上是未定义的行为?

c undefined-behavior sequence-points compound-assignment

13
推荐指数
4
解决办法
617
查看次数

将数据清零时出现奇怪的XOR交换行为

谢谢道格.这是修复:

void swap(int& a, int& b) {
    if (&a == &b) // added this check to ensure the same address is not passed in
        return;

    a ^= b;
    b ^= a;
    a ^= b;
}
Run Code Online (Sandbox Code Playgroud)


我正在使用C++实现quicksort以获得乐趣,我使用整数来表示虚拟数据.我一直在使用XOR交换算法来交换两个值,但我注意到我的排序搞砸了.我改变了我的交换算法并且工作正常.我添加了一些调试语句,发现XOR交换做了一些奇怪的事情.

我在交换之前和之后打印了数据,这就是它打印的内容:

...

swapping -5, -3
swapped  -3, -5

swapping -5, -5
swapped  0, 0     <---- What?

swapping -2, -4
swapped  -4, -2

...
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

// this might not be that great or even work as intended but it doesn't really matter for this problem …
Run Code Online (Sandbox Code Playgroud)

c++ swap xor quicksort

3
推荐指数
1
解决办法
716
查看次数

C和C++之间关于"^ ="运算符的区别

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

*x ^= *y ^= *x ^= *y;
Run Code Online (Sandbox Code Playgroud)

(好吧,我知道这个表达很尴尬,我只是想知道它的区别,没有冒犯.)这在C++中有效,但在C中失败了.但是如果我把它分成三部分,如下所示

*x ^= *y;
*y ^= *x;
*x ^= *y;
Run Code Online (Sandbox Code Playgroud)

它适用于两种语言.

那么,^=C和C++ 中的运算符有什么区别?

c c++ assignment-operator

3
推荐指数
1
解决办法
159
查看次数