在C++中,问号字符('?')代表什么意思?

107
int qempty()
{
    return (f == r ? 1 : 0);
}
在上面的代码片段中,“?”代表什么?我们可以用什么替换它?

24
在这种情况下,您只需将其替换为 return f==r;。 - Eclipse
7
@Eclipse:如果我能避免的话,我不会依赖于隐式转换bool->int。 - Daniel Daranas
2
@DanielDaranas 为什么不呢?(这是一个初学者问题- 对于初学者解释你的评论将非常有帮助和感激。) - Michael Hoffmann
4
在这种情况下,隐式转换的行为是定义良好的,因此使用它是完全正确的;有关标准的参考,请参见此答案。个人而言,我避免使用隐式类型转换,因为我认为在没有它们的情况下,代码更易读、易于维护且更少出错。我在这篇博客文章中写得更详细。 - Daniel Daranas
8个回答

167

这通常被称为条件运算符,当像这样使用时:

condition ? result_if_true : result_if_false

如果条件的计算结果为true,表达式将评估为result_if_true,否则它将评估为result_if_false

这是一种语法糖,在这种情况下,它可以被替换为

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

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


5
在常规代码中,它是语法糖,但它使你能够在构造函数的初始化列表中进行条件初始化。 - JohnMcG
Foo(Bar * y)pMember(y == NULL?NULL:y-> pMember) - 在这里,我们将pMember初始化为y的pMember,如果没有,则为NULL。不能在构造函数初始化中放置if-else,因此三元运算符使其成为可能。 - JohnMcG
@JohnMcG:在C++11中,你可以将a? b : c视为[&]()->Type {if (a) return b; else return c;}()的语法糖。 - celtschk
2
可能是的,但这个问题、答案和评论都是在2009年编写的。 - JohnMcG

17

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

x ? y : z

工作原理类似于

if(x) y else z

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

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


4
值得知道的是,'?'处有一个序列点。这意味着以下语句是有效的:++x ? x : y; - Johannes Schaub - litb
1
@Daniel,我指的是使用表达式而不是语句。可能我没有明确区分它们的差异,所以感谢你加入了一些澄清。 - Richard

13

在CLang中(至少是最新版本),这个扩展也是可用的。即使在qmake项目中关闭了C++11标志,它也是可用的。因此,像int x = 1+1 ? : 0;这样的表达式在我的编译器中正确返回了2,并且没有报错。 - Vinícius A. Jorge

6
你可以将其简单重写为:
int qempty(){ return(f==r);}

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


1
这将执行从布尔值到整数的隐式转换。 - Don Cheadle

5

这被称为 条件运算符

你可以用以下方式替换它:

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

3

这是条件运算符。

a ? b : c

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

意思是:如果a为真,则返回b,否则返回c。在本例中,如果f等于r,则返回1,否则返回0。


2

问号是条件运算符。代码的意思是如果f等于r,则返回1,否则返回0。该代码也可以重写为

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

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


2

它的内容为:

If f == r then return 1 else return 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接