下面的C程序的输出是如何等于3的?

fiei3ece  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(94)

我正在做一些编程问题,我遇到了下面的片段

#include <stdio.h>

int main()
{
    printf("%d", 1 ^ 0 + 3 ^ 0 == 0);

    return 0;
}

这段代码的输出是3,请帮助我理解这是怎么回事。
我的思维过程:1^0 = 1,3^0 = 3,那么1 + 3 = 4不等于0,所以结果应该是零。

4uqofj5v

4uqofj5v1#

Ted Lyngmo将您指向operator precedence表是正确的。相关的剪报。* 从上到下按优先级降序排列 *
| 水平|操作者|
| --|--|
| 1 |()下一页|
| 4 |+的|
| 7 |=-|
| 9 |- -|
因此,如果我们用括号消除你的表达式的歧义:
如果我们开始简化:

(1 ^ (0 + 3)) ^ 1

(1 ^ 3) ^ 1

(0b01 ^ 0b11) ^ 0b01

0b10 ^ 0b01

0b11

3
zte4gxcn

zte4gxcn2#

Operator precedence和这个例子可以帮助:

#include <stdio.h>

int main(void) {
    printf("%d\n", 1 ^ (0 + 3) ^ (0 == 0));
}
iyr7buue

iyr7buue3#

视觉表现

提供的答案已经很好地解释了摆姿势行为背后的推理,但是更直观地描述C简化方程的方式可能对未来的访问者有帮助:

运算符优先级

该方程已根据以下operator predence order-求解:

解释:

给定的方程由C根据其运算符优先级规则here求解。对于给定等式中使用的运算符,优先顺序如下:
(+)>(==)>(^)
此外,如果方程中的所有运算符具有相同的优先级,则方程从左到右求解。

9bfwbjaz

9bfwbjaz4#

#include <stdio.h>

int main() 
{
    /* Plus(+) operator has precedence over comparison (==) operator,
    ** and comparison (==) has precedence over XOR(^) operator, so 
    ** evaluation goes like so:
    ** 1 ^ 0 + 3 ^ 0 == 0
    ** 1 ^ (0 + 3) ^ 0 == 0 
    ** 1 ^ 3 ^ (0 == 0)
    ** 1 ^ 3 ^ 1       <-- so this should print 3.  */
    printf("%d\n", 1 ^ 3 ^ 1);  /* Prints '3' ? -- yup */
    
    /* When you want to be sure about precedence and 
    ** what is going on, you can always de-obfuscate 
    ** by forcing precedence with parenthesis */
    printf("%d\n", ((1 ^ 0) + (3 ^ 0)) == 0 );  /* Prints '0' */

    printf("%d\n", ((1 ^ 0) + (3 ^ 0)));    /* Prints '4' */

    return 0;
}

相关问题