【问题标题】:C program logic operator sequenceC 程序逻辑运算符序列
【发布时间】:2014-04-07 16:14:48
【问题描述】:

为什么第二行

int i=-3, j=2, k=0, m;
m = ++i && ++j || ++k;

++j 之后终止并忽略++k ? 我知道前半部分是 TRUE 值,并且无论以下值是什么都会返回 TRUE。但是停止执行以下工具的条件是什么?只要我们能确认最终值?

【问题讨论】:

标签: c


【解决方案1】:

&& 的优先级高于||++i++j 绑定到它并

m = ++i && ++j || ++k;  

被解析为

m = (++i && ++j) || ++k;  

由于子表达式++i++j 都不是零,它被解释为true。由于逻辑运算符的短路行为,如果 left 变为 true,则在 || 的情况下不会评估第二个(右)子表达式。
注意|| 的左子表达式是(++i && ++j),而不是j++

【讨论】:

    【解决方案2】:

    条件就是这样。在 C 中的 OR 中,只要发现结果为真,就不会计算其余表达式。

    如果要测试真假,同时又要确保所涉及的变量增加,则应该先增加变量再测试:

    ++i;
    ++j;
    ++k;
    
    m = i && j || k;
    

    【讨论】:

      【解决方案3】:

      如果第一个操作数的计算结果为 TRUE,|| 运算符不会计算第二个操作数。 如果第一个操作数的计算结果为 FALSE,&& 运算符不会计算第二个操作数。

      【讨论】:

        【解决方案4】:

        逻辑与和逻辑或表达式的操作数从左到右计算。如果第一个操作数的值足以确定运算结果,则不计算第二个操作数。这称为“短路评估”。在第一个操作数之后有一个序列点。有关详细信息,请参阅序列点。

        得到你想要的答案:here

        【讨论】:

          猜你喜欢
          • 2017-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多