【发布时间】:2014-04-06 12:14:54
【问题描述】:
有人可以画出表达式的优先级树,请解释一下副作用..在 C 中表达式求值后的值。
int i=-3, j=2, k=0, m;
m= ++i || ++j&&++k;
根据我的输出应该是 -2 3 1 1 但我的 gnu c 编译器打印是 -2 2 0 1? 我想知道怎么做?
【问题讨论】:
标签: c expression
有人可以画出表达式的优先级树,请解释一下副作用..在 C 中表达式求值后的值。
int i=-3, j=2, k=0, m;
m= ++i || ++j&&++k;
根据我的输出应该是 -2 3 1 1 但我的 gnu c 编译器打印是 -2 2 0 1? 我想知道怎么做?
【问题讨论】:
标签: c expression
因为j 由于short circuit evaluation 而不会被评估:
m= ++i || ++j && ++k;
↑
在这个阶段,无论|| 的右侧如何,m 已经被评估为 1。为什么?
因为1 || anything 是 1。
【讨论】:
C 短路中的 && 和 || 运算符。这意味着如果它们左侧的值足以确定整体值,则永远不会评估右侧。
您的表达式被解析为(++i) || ((++j)&&(++k))。 || 短路,所以在计算 ++i 后,发现它的值为 -2(true 值),不再计算表达式。
【讨论】: