【问题标题】:What does the question mark character ('?') mean in C++?问号字符 ('?') 在 C++ 中是什么意思?
【发布时间】:2010-10-22 04:06:06
【问题描述】:
int qempty()
{
    return (f == r ? 1 : 0);
}

在上面的sn-p中,“?”是什么意思?意思是?我们可以用什么来代替它?

【问题讨论】:

  • 当然,在这种特殊情况下,您可以将其替换为 return f==r;
  • @Eclipse:如果可以避免的话,我不会依赖隐式转换 bool->int。
  • @DanielDaranas 为什么不呢? (这是一个初学者的问题 - 对初学者的 cmets 的解释将非常有帮助和赞赏。)
  • @MichaelHoffmann 在这种情况下,隐式转换的行为是明确定义的,因此使用它是完全正确的;请参阅this answer 以获取对该标准的参考。就我个人而言,我避免使用隐式类型转换,因为我认为没有它们,代码更易读、更易于维护并且更不容易出错。我在blog post 中写了更详细的内容。

标签: c++ operators conditional-operator


【解决方案1】:

这通常被称为conditional operator,当这样使用时:

condition ? result_if_true : result_if_false

...如果condition 计算结果为true,则表达式计算结果为result_if_true,否则计算结果为result_if_false

syntactic sugar,在这种情况下,可以替换为

int qempty()
{ 
  if(f == r)
  {
      return 1;
  } 
  else 
  {
      return 0;
  }
}

注意:有些人把?:称为“三元运算符”,因为它是唯一的三元运算符(即接受三个参数的运算符)他们使用的语言。

【讨论】:

  • 在常规代码中,它是语法糖,但它确实使您能够在构造函数的初始化列表中进行条件初始化。
  • Foo(Bar* y) pMember (y == NULL ? NULL : y->pMember) -- 在这里,我们将 pMember 初始化为 y 的 pMember,如果不存在则为 NULL。无法将 if-else 放入构造函数初始化中,因此三元运算符使其成为可能。
  • @JohnMcG:好吧,在 C++11 中,您可以考虑将 a? b : c 语法糖视为 [&]() -> Type { if (a) return b; else return c; }()
  • 可能吧,不过问题、答案和评论都是2009年写的。
【解决方案2】:

这是条件运算符。

一个?乙:c

这是 IF/THEN/ELSE 的快捷方式。

意思是:如果a为真,返回b,否则返回c。在这种情况下,如果 f==r,则返回 1,否则返回 0。

【讨论】:

    【解决方案3】:

    这是一个三元运算符,它基本上是一个内联 if 语句

    x ? y : z
    

    if(x) y else z
    

    除了,你有表达式而不是语句;所以你可以在更复杂的语句中间使用它。

    它对于编写简洁的代码很有用,但可能被过度使用以创建难以维护的代码。

    【讨论】:

    • 值得知道'?'处有一个序列点。这意味着以下内容是有效的: ++x ? x : y;
    • @Daniel,这就是我所说的表达而不是陈述的意思。我可能对差异不够明确,因此感谢您添加一些说明。
    【解决方案4】:

    它被称为conditional operator

    您可以将其替换为:

    int qempty(){ 
        if (f == r) return 1;
        else return 0;
    }
    

    【讨论】:

      【解决方案5】:

      问号是条件运算符。代码表示如果 f==r 则返回 1,否则返回 0。代码可以重写为

      int qempty()
      {
        if(f==r)
          return 1;
        else
          return 0;
      }
      

      这可能不是最干净的方法,但希望能帮助您理解。

      【讨论】:

        【解决方案6】:

        你可以改写为:

        int qempty(){ return(f==r);}
        

        与其他答案中所说的相同。

        【讨论】:

        • 这将执行从布尔到整数的隐式转换
        【解决方案7】:

        请注意,如果您看到此内容:

        a = x ? : y;
        

        它是标准的 GNU 扩展(参见 https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals)。

        和这个一样

        a = x ? x : y;
        

        【讨论】:

        • 在 CLang(至少是最新版本)中,这个扩展也是可用的。即使在 qmake 项目中关闭了 C++11 标志,它也可用。所以像 int x = 1+1 ? : 0 这样的表达式;在我的编译器中正确返回2 ,这并没有抱怨什么。
        【解决方案8】:

        它读作:

        If f == r then return 1 else return 0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多