【问题标题】:Ternary operators and Return in CC中的三元运算符和返回
【发布时间】:2011-04-03 17:51:54
【问题描述】:

为什么我们不能在 C 中的三元运算符中使用 return 关键字,像这样:

sum > 0 ? return 1 : return 0;

【问题讨论】:

  • return sum > 0 ? 1 : 0; 有什么问题?
  • 或者,就此而言,if (sum > 0) return 1 ; else return 0 ;
  • 或者return sum > 0;
  • 因为a ? b : c 是一个包含表达式而不是语句的表达式。而return d 是一个语句,而不是一个表达式。
  • 因为它是一个运算符,而不是if 语句。

标签: c conditional-operator


【解决方案1】:

return 是一个声明。语句不能以这种方式在表达式中使用。

【讨论】:

    【解决方案2】:

    因为三元运算是表达式,不能在表达式中使用语句。

    不过,您可以轻松地在 return 中使用三元运算符。

    return sum > 0 ? 1 : 0;
    

    或者正如 DrDipShit 指出的那样:

    return sum > 0;
    

    【讨论】:

    • 只是:返回总和> 0;无论如何,它返回 1 或 0。
    • @DrDipShit:非常正确,在这种情况下效果也很好:)
    【解决方案3】:

    因为return 是一个语句,而不是一个表达式。你也不能int a = return 1;

    【讨论】:

      【解决方案4】:

      查看三元运算符的语法是

      expr1 ? expr2: expr3;
      

      其中expr1expr2expr3 是表达式;

      运算符?: 的工作原理如下 expr1 如果为真,则首先评估 expr2,否则评估 expr3

      因此在表达式中,return 语句不能在 C 语言中使用。

      【讨论】:

        【解决方案5】:

        只要看一下语法,您就应该知道语句不能在表达式中使用。 你想要的可以通过做:return sum > 0 ? 1 : 0;

        【讨论】:

          【解决方案6】:

          三元运算符处理表达式,但return是一个语句。

          return 语句的语法是

          return expr ;

          三元条件运算符的语法是

          expr1 ? expr2 : expr3

          因此,您可以在return 语句中插入对三元运算符的调用作为expr。但是您不能将 return 语句插入为三元运算符的 expr2expr3

          三元表达式的行为很像if 语句,但它不能完全替代if 语句。如果你想写

          if(sum > 0)
               return 1;
          else return 0;
          

          你可以把它写成一个真正的if 语句,但是你不能将它转换为使用? : 而不重新排列它,就像我们在这里看到的那样。

          【讨论】:

            【解决方案7】:

            return 语句用于从function 返回,不能在内部使用三元运算符。

             (1==1)? return 1 : return 0; /* can't use return inside ternary operator */
            

            你可以做到

            return (1==1) ? 1 : 0;
            

            三元运算符的语法如下

            expr1 ? expr2 : expr3;
            

            其中expr1expr2expr3 是表达式,return 是语句,而不是表达式。

            【讨论】:

              【解决方案8】:

              您可以使用 gcc 的/clang 的语句表达式功能。

              #include <stdio.h>
              
              #define discard(value) ({return value; value;})
              
              int foo(int a) {
                      int b = a%2 ?: discard(0);
                      return b*a;
              }
              
              int main(int argc, char argv) {
                      printf("foo(%d) = %d;\n", argc, foo(argc));
                      return foo(argc);
              }
              

              结果是:

              $ ./bar 
              foo(1) = 1;
              $ ./bar 2
              foo(2) = 0;
              $ ./bar 2 3
              foo(3) = 3;
              $ ./bar 2 3 4
              foo(4) = 0;
              $ ./bar 2 3 4 5
              foo(5) = 5;
              $ ./bar 2 3 4 5 6
              foo(6) = 0;
              $ ./bar 2 3 4 5 6 7
              foo(7) = 7;
              $ ./bar 2 3 4 5 6 7 8
              foo(8) = 0;
              $ ./bar 2 3 4 5 6 7 8 9
              foo(9) = 9;
              $ ./bar 2 3 4 5 6 7 8 9 10
              foo(10) = 0;
              

              【讨论】:

                猜你喜欢
                • 2021-07-04
                • 1970-01-01
                • 2020-08-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-01-25
                • 2012-12-25
                • 2014-12-03
                相关资源
                最近更新 更多