【问题标题】:Multiple parts of ternary opperators interaction三元算子交互的多个部分
【发布时间】:2018-11-14 19:51:05
【问题描述】:

这会打印出4。为什么?

我知道三元运算符的工作原理,但这使它变得复杂。

printf("%d", 0 ? 1 ? 2 : 3 : 4 );

这也会打印d。 ???

int x=0, y=1 ;
printf( "d", x ? y ? x : y : x ) ;

【问题讨论】:

  • 如果你问“为什么”,你应该告诉我们你为什么认为它不应该这样。
  • 我问是因为我不知道。我从未声称打印值是错误的或正确的。
  • 一旦得到答案,删除部分问题是一种不好的形式。帖子回滚。
  • 请注意,由于一些晦涩的原因,PHP 人员认为反转三元条件运算符的关联性是个好主意。 C、C++、C# 和 Java。不过,在你的情况下,这并不重要。

标签: c ternary-operator


【解决方案1】:

对于第一个,它是一个“嵌套”三元运算符。我会在它周围加上括号以使其更易于解码。考虑0 ? 1 ? 2 : 3 : 4,让我们将其转换为0 ? (1 ? 2 : 3) : (4)0? else部分执行的是4

第二次你错过了%d

【讨论】:

    【解决方案2】:

    if..else 声明分解它

    if(0){
        if(1)
            printf("%d\n", 2); 
        else
            printf("%d\n", 3);
    } 
    else
        printf("%d\n", 4);
    

    【讨论】:

      【解决方案3】:

      确实应该打印 4。三元运算符的工作方式如下:

      (condition) ? expression1 : expression2

      如果条件为真,则返回expression1,否则返回expression2。 在您的情况下,结构如下:

      0?(1?2:3):4 即这里1?2:3 是表达式1,4 是表达式2,而我们有0 的代替条件。如您所知,0 在条件下的计算结果为假,任何非零值的计算结果为真。 所以这里由于条件为假(即0),因此返回表达式2(4)。

      【讨论】:

        【解决方案4】:
        0 ? 1 ? 2 : 3 : 4
        

        解析为

        (0 ? (1 ? 2 : 3) : 4)
        

        所以,你得到了一个4 的输出。

        【讨论】:

          【解决方案5】:
          printf("%d", 0 ? 1 ? 2 : 3 : 4 );
          

          这里的格式说明符是“%d”,所以它打印的是正确的值 4。 但是,在

          int x=0, y=1 ;
          printf( "d", x ? y ? x : y : x ) ;
          

          这里没有提到格式说明符,所以它只是打印了“d”并忽略了其他参数。

          【讨论】:

            【解决方案6】:

            三元运算符类似于 if else。如果在代码中添加括号,事情会变得更简单:

            0 ? (1 ? 2 : 3) : 4
            

            请记住,在 C 中,零表示假,所有非零都表示真。所以上面的语句在测试中失败并返回它的第三部分,即 4。

            【讨论】:

              【解决方案7】:

              语句中有多个三元运算符 printf("%d", 0 ? 1 ? 2 : 3 : 4 );

              当同一个运算符多次出现时,我们曾经检查associativity,它是从RightLeft 的三元运算符,即首先解决right most ternary opeartor。或者你可以在man 1 operator看到这个

              首先选择最右边的三元运算符1 ? 2 : 3,结果为2。现在3 不见了。

              现在它变成了0 ? 2 : 4,结果是4。这就是它打印4 的原因。

              注意:-正如其他人所说,使用右结合三元运算符,您可以将它们堆叠并构建if-else 表达式,如下所示:

              if(0){ if(1) printf("%d\n", 2); else printf("%d\n", 3); } else printf("%d\n", 4);

              【讨论】:

              • 右关联性不相关,因为只有一种可能的方法来解析它。右关联性对 a?b:c?d:e 很重要,可以通过两种不同的方式进行解析。
              • 我看到了一条对已删除答案的评论,他说在这种情况下关联性不是相对的,但仅在这个a?b:c?d:e。我不是说你错了,我只是问。^^^^^^ ^^^^^^^
              • missclick.i 重新加载页面,它出现在顶部。
              • 重要的是@interjay,否则为什么要在手册页中添加。
              • 当然在某些情况下这很重要,我什至举了一个这样的例子。在 OP 的代码中并不重要。
              猜你喜欢
              • 2011-12-07
              • 2014-11-23
              • 2011-12-27
              • 2022-12-10
              • 2020-04-29
              • 2023-03-17
              • 2016-01-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多