【问题标题】:C Language Operators [closed]C 语言运算符 [关闭]
【发布时间】:2017-08-04 20:20:47
【问题描述】:
#include <stdio.h>  

int main() 
{

    int a=-1?2:5 + 8?4:5;
    printf("%d\n",a);
    return 0;
}

上面程序的输出是2。但是为什么呢?请解释

【问题讨论】:

  • 不要这样写代码,拜托。
  • 您可以尝试将代码分解为单个表达式并打印出来
  • 你应该解释为什么你不能解释这段代码。
  • 为什么你认为它可能不是2?解释你的推理,然后我们可以帮助你了解你哪里出错了。

标签: c operators ternary-operator operator-precedence conditional-operator


【解决方案1】:

编写人类可读和可理解的代码。 (至少,尝试...

 int a=-1?2:5 + 8?4:5;

一样
int a = (-1) ? 2 : ( 5 + ( 8 ? 4 : 5) );

参考:Operator Precedence

现在,让我们将其与三元运算符条件进行比较,如C11,第 6.5.15 章所述,

计算第一个操作数;在它的求值和 第二个或第三个操作数的评估(以评估者为准)。第二个操作数 仅当第一个比较不等于 0 时才评估;仅在以下情况下评估第三个操作数 第一个比较等于 0;结果是第二个或第三个操作数的值 (以评估为准),

所以,在你的情况下,

  • 第一个操作数不等于零
  • 因此,它计算第二个操作数,并将结果(操作数的值)返回并存储到赋值运算符的 LHS 变量中。

【讨论】:

  • 我反对将第二种形式称为“人类可读和可理解”
  • @StoryTeller 好吧,现在好点了吗?不能做更多的事情。
  • 并非如此。我的反对意见一般是对任何使用三元运算符的代码应用“人类可读和可理解的”:)
  • @StoryTeller :) 我知道,请参阅问题下的评论。
【解决方案2】:

声明:

int a=-1?2:5 + 8?4:5;

或者最好用括号写:

int a = (-1) ? 2 : ( 5 + 8?4:5);

这又意味着:

if (-1)
    a = 2;
else {
    if (8)
        a = 9; //5+4
    else
        a = 10; //5+5
}

任何不同于0 的条件都被评估为true。所以条件if(-1) 不同于0,因此true。因此,if 块将被执行,a 将获得值2

【讨论】:

    【解决方案3】:

    因为如果a 不为零,则a ? b : c 的计算结果为b,并且在您的代码中a (-1) 不为零且b 为2。

    【讨论】:

      【解决方案4】:

      让我们一步一步来看看,

      int a=-1?2:5 + 8?4:5;

      int a = (-1) ? 2 : ( 5 + 8?4:5);
      

      对于三元运算符(条件)?返回真:返回假;

      0 = False 
      Other than 0 = true
      

      因此 -1 = 真

        int a = (true) ? 2 : ( 5 + 8?4:5);
        int a = 2;
      

      【讨论】:

      • 这里是C,这里truefalse实际上已经定义了值,这里分别是1和0。
      • @SouravGhosh 宏 truefalse 是 C 标准库的一部分,而不是语言的一部分。它们的 整数常量 值 1 和 0 是在读取 &lt;stdbool.h&gt; 时定义的。这个答案显然在逻辑意义上使用“true”、“false”,而不是 C 库关键字意义上的。
      • @chux 同意,只是想发表评论以澄清这一点,感谢您完成评论。 :)
      【解决方案5】:

      一般说明:格式:

      x = a ? b : c;
      

      意思:

      if (a) // always results in true unless a = 0
          x = b;
      else
         x = c;
      

      现在,括号中的语句:

      int a = (-1) ? 2 : ( 5 + ( 8 ? 4 : 5) );
      

      只是一个缩短的 if-else 嵌套语句组。展开后,它看起来像:

      if (-1) // since it is not zero, this is true
          a = 2;
      
      else // since the if-block is true, this is ignored by the compiler
      {
          if (8)
              a = 5 + 4; // computes to 9
          else
              a = 5 + 5; // computes to 10
      }
      

      因此,由于第一个 if 语句为真,编译器将 2 存储在变量 a 中。

      顺便说一句,您应该避免编写难以阅读的代码。尽管您的语句比编写整个 if 块短,但阅读 if-else 嵌套块比阅读您的语句更容易理解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-03
        • 2022-11-03
        • 1970-01-01
        • 2012-09-24
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多