【问题标题】:Logical operator with Arithmetic operator in CC中带有算术运算符的逻辑运算符
【发布时间】:2014-11-18 04:11:43
【问题描述】:

我遇到了一个问题,我想验证我的假设是否正确。

给定以下代码:

1.    int i = -2, j = 1, ans;
2.    ans = i++ || ++j;
3.    printf("%d %d %d", i,j, ans);

输出为:-1 1 1

在 C 语言中,似乎只有 0 会被视为 false,任何其他值在与逻辑运算符一起使用时都会被视为 true。所以我不怀疑为什么 ans 派生为 1 (true || true 给我们 true(1) )

我想在这里问的是:尽管++j,为什么j 的值仍然是1 而不是2? 可以安全地假设逻辑运算符 || && 之后的 any 算术运算将仅在使用它的行(在本例中为第 2 行)有效,之后变量仍然保留原来的价值?

【问题讨论】:

标签: c logical-operators


【解决方案1】:

|| 运算符在第一个操作数为 nonzero 时不会对第二个操作数进行任何操作。

因为任何一个操作数都是non-zero,那么在||操作符操作中,输出将是true。在您的代码中,第一个操作数是 non-zero。这就是为什么不对第二个操作数执行操作的原因。

【讨论】:

    【解决方案2】:

    如代码的第二行,即

    ans = i++ || ++j;
    

    首先它会检查i++,因为它不是零,这意味着它是真的。 在OR 条件中,如果第一个条件为真,则不会检查第二个条件,即++j。

    因为如果第一个条件为真无关紧要,第二个条件是 TRUE 或 FALSE 它将返回一个真值。因此,如果第一个条件为真,则不会检查其他条件。

    【讨论】:

    • 所以如果我理解这一点,如果我们在第一行将i=-2 更改为i=-1,输出为:0 2 1?
    • 电脑说不。为什么j 在这种情况下不会增加?
    • @AndyJ0076 不,它应该首先打印0 1 1,它将评估i 的值,即-1 并返回TRUE,因此不检查j++。最后它将执行i++。
    • @AndyJ0076 尝试使用i=0 和j=1 然后它将检查j++ 并返回1 2 1。
    • 啊,我明白了。那么在原始示例中,i 在第二行测试,然后递增,然后在第三行打印?
    【解决方案3】:

    逻辑运算符短路。也就是说,在下面:

    ans = i++ || ++j;
    

    如果i++ 评估为真(非零),则永远不会评估++j。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 2010-09-05
      • 2020-04-14
      • 2012-09-02
      • 2014-07-07
      • 1970-01-01
      相关资源
      最近更新 更多