C 中语句 z=++x||++y&&++z 的运算符优先级
Operator precedence in C for the statement z=++x||++y&&++z
我正在研究运算符优先级,但我无法理解 x
的值如何变为 2
以及 y
和 z
的值如何变为 1
x=y=z=1;
z=++x||++y&&++z;
计算结果为
x=2 y=1 z=1
++
比 ||
具有更高的优先级,因此赋值的整个 RHS 归结为 x
的增量和对真值 (1) 的评估。
z = ++x || ++y&&++z;
truthy (1) never executed
这是因为++x
计算结果为真,第二个分支没有执行。 ++x
是 2
,在布尔上下文中,它的计算结果为 true 或 1
。 z
取 1
的值,给你观察到的最终状态。
z=++x||++y&&++z;
注意:++
的优先级高于 ||
现在,在执行此行后,x
的值会递增,并且 x=2
现在 ++y&&++z
永远不会执行,因为第一个条件为真,因此您得到的值为x=2 y=1 z=1
x=y=z=1
z=++x||++y&&++z
等同于
x=y=z=1
z=((++x)||((++y)&&(++z)));
因为 ++x
returns 2
是非零的,++y && ++z
分支永远不会执行,因此代码等同于:
x=y=z=1;
z=(++x)||(anything here);
和&&
和或||
操作从左到右执行,而且,在 C 中,0
表示 false
,任何非零值表示 true
。你写
x=y=z=1;
z= ++x || ++y && ++z;
因为,x = 1
,所以语句++x
就是true
。因此,进一步的条件 ++y && ++z
未执行。
所以输出变成了:
x=2 // x incremented by 1
y=1 // as it is
z=1 // assigned to true (default true = 1)
现在试试这个,
z= ++y && ++z || ++x ;
您将获得
x=1 // as it is because ++y && ++z are both true
y=2 // y incremented by 1
z=1 // although z incremented by 1 but assigned to true (default true = 1)
最后试试这个:
int x = 1;
int y = 0;
int z = 1;
z= y && ++z || ++x;
输出将是:
所以输出变成了:
x=2
y=0
z=0
因为,现在 z 的语句是这样的:
z = false (as y =0) && not executed || true
z = false || true
z = true
因此,y
保持不变,x 增加并变为 2
,最后 z
分配给 true
。
我正在研究运算符优先级,但我无法理解 x
的值如何变为 2
以及 y
和 z
的值如何变为 1
x=y=z=1;
z=++x||++y&&++z;
计算结果为
x=2 y=1 z=1
++
比 ||
具有更高的优先级,因此赋值的整个 RHS 归结为 x
的增量和对真值 (1) 的评估。
z = ++x || ++y&&++z;
truthy (1) never executed
这是因为++x
计算结果为真,第二个分支没有执行。 ++x
是 2
,在布尔上下文中,它的计算结果为 true 或 1
。 z
取 1
的值,给你观察到的最终状态。
z=++x||++y&&++z;
注意:++
的优先级高于 ||
现在,在执行此行后,x
的值会递增,并且 x=2
现在 ++y&&++z
永远不会执行,因为第一个条件为真,因此您得到的值为x=2 y=1 z=1
x=y=z=1
z=++x||++y&&++z
等同于
x=y=z=1
z=((++x)||((++y)&&(++z)));
因为 ++x
returns 2
是非零的,++y && ++z
分支永远不会执行,因此代码等同于:
x=y=z=1;
z=(++x)||(anything here);
和&&
和或||
操作从左到右执行,而且,在 C 中,0
表示 false
,任何非零值表示 true
。你写
x=y=z=1;
z= ++x || ++y && ++z;
因为,x = 1
,所以语句++x
就是true
。因此,进一步的条件 ++y && ++z
未执行。
所以输出变成了:
x=2 // x incremented by 1
y=1 // as it is
z=1 // assigned to true (default true = 1)
现在试试这个,
z= ++y && ++z || ++x ;
您将获得
x=1 // as it is because ++y && ++z are both true
y=2 // y incremented by 1
z=1 // although z incremented by 1 but assigned to true (default true = 1)
最后试试这个:
int x = 1;
int y = 0;
int z = 1;
z= y && ++z || ++x;
输出将是:
所以输出变成了:
x=2
y=0
z=0
因为,现在 z 的语句是这样的:
z = false (as y =0) && not executed || true
z = false || true
z = true
因此,y
保持不变,x 增加并变为 2
,最后 z
分配给 true
。