【问题标题】:what does this return statement mean这个返回语句是什么意思
【发布时间】:2014-10-31 18:10:18
【问题描述】:

在书中这些是一个简单的 C 函数:

char *month_name(int n)
{
  static char *name[] = {
  "Illegal month",
  "January", "February", "March",
  "April", "May", "June",
  "July", "August", "September",
  "October", "November", "December"
  };

  return (n < 1 || n > 12) ? name[0] : name[n];
}

这个函数的作用很容易理解,但是return语句我没看懂,这里return语句是怎么工作的。

【问题讨论】:

  • 哪一部分你不明白? ? : 运算符?
  • 那句话中的什么你不明白?
  • ?: 称为条件运算符。许多人(错误地)称它为三元运算符,因为它由3个子表达式组成;但 C 标准在任何地方都没有这个名称。
  • @pmg: 三元运算符是正确的(定冠词在那儿很重要):它是语言中唯一的三元运算符。它是条件运算符这一事实并没有错。
  • 这是一种非常冗长的写法。更短的是:return name[n &lt; 1 || n &gt; 12 ? 0 : n];

标签: c ternary-operator conditional-operator return


【解决方案1】:

它是一个三元运算符..

condition? a: b

这意味着如果条件为真,则表达式 a 将被处理,如果其为假,则 b 将被处理。

在您的代码中,它将检查 n 是否不在 1-12 范围内(月数)。如果不在范围内,则返回 name[0](即非法月份)。否则,如果它在范围内,那么它将使用 n 作为数组名称的索引来打印月份的名称。

【讨论】:

    【解决方案2】:

    return (n &lt; 1 || n &gt; 12) ? name[0] : name[n]; 可以改写为:

    if (n < 1 || n > 12)
        return name[0];
    else
        return name[n];
    

    所以函数返回传递给函数的 n = 1...12 的月份名称,否则返回“非法月份”。

    【讨论】:

      【解决方案3】:

      称为三元运算符,意思是:如果n 12,则返回name[0] - “非法月份”。否则,返回 name[n] - 正确的月份。

      【讨论】:

        【解决方案4】:

        相当于如下:

        if(n < 1 || n > 12)
            return name[0];
        else
            return name[n];
        

        【讨论】:

          【解决方案5】:

          ? : 是三元运算符。

          如果是n &lt; 1 || n &gt; 12,它将返回"Illegal month",否则返回月份名称。

          【讨论】:

            【解决方案6】:

            展开后,return 语句等价于:

            if (n < 1 || n > 12)
            {
                return name[0];
            }
            else
            {
                return name[n];
            }
            

            return 语句采用 三元运算,其语法如下:

            (if condition)? true_return_value: false_return_value;
            

            【讨论】:

              【解决方案7】:

              虽然许多人指出这与以下内容相同:

              if(n < 1 || n > 12)
                  return name[0];
              else
                  return name[n];
              

              这并不完全正确。三元运算符是运算符,因此(n &lt; 1 || n &gt; 12) ? name[0] : name[n]表达式,而不是语句。更接近的例子是:

              string ret_value;
              
              if(n < 1 || n > 12)
                  ret_value = name[0];
              else
                  ret_value =name[n];
              
              return ret_value;
              

              当您在中间需要条件时,这一点变得很重要:

               return String.Format("The test {0} successful", bOK ? "WAS" : "was NOT");
              

              【讨论】:

                猜你喜欢
                • 2018-01-31
                • 2012-01-05
                • 2021-12-25
                • 2014-03-30
                • 1970-01-01
                • 1970-01-01
                • 2022-01-12
                • 1970-01-01
                相关资源
                最近更新 更多