什么是“?” 用C ++做?


80
int qempty()
{
    return (f == r ? 1 : 0);
}

在以上代码段中,“ ”是什么意思?我们可以用什么代替它?


22
当然,在这种情况下,您可以将其替换为return f == r;

27
在评论中,它用来问一个问题。
Mehrdad Afshari 2009年

6
@Eclipse:如果可以避免的话,我不会依赖隐式转换bool-> int。
Daniel Daranas 09年

2
@DanielDaranas为什么不呢?(这是一个初学者的问题-对初学者的评论解释将非常有帮助和赞赏。)
Michael Hoffmann

4
@MichaelHoffmann在这种情况下,隐式转换的行为已得到很好的定义,因此使用它是完全正确的。请参阅此答案以获取对标准的参考。就我个人而言,我避免使用隐式类型转换,因为我认为代码更易于阅读和维护,并且没有它们就更不会出错。我在此博客文章中对此进行了更详细的介绍。
丹尼尔·达拉斯

Answers:


131

通常将其称为条件运算符,并按如下方式使用:

condition ? result_if_true : result_if_false

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

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

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

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


我认为它们隐含的意思是“(C ++)三元运算符”。C ++中还存在哪些其他三元运算符?
sblom

对于需要有条件的爱的任何人:artima.com/cppsource/foreach.html。eric niebler解释了他的boost.foreach如何使用条件运算符。
Johannes Schaub-litb

4
在常规代码中,它是语法糖,但是它的确使您能够在构造函数的初始化列表中进行条件初始化。
JohnMcG

@JohnMcG等待,什么?你能举个例子吗?
Tim

1
可能是,但问题,答案和评论写于2009
。– JohnMcG 2014年

15

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

x ? y : z

if(x) y else z

除了声明以外,您还有表达式;因此您可以在更复杂的语句中间使用它。

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


4
您在这里必须小心;它与if语句不完全一样。虽然您可以说类似int的内容,但a = x ? y : z;不能int a = if(x) y else z;
Daniel LeCheminant 09年

4
值得知道在“?”处有一个序列点。这意味着以下内容是有效的:++ x?x:y;
Johannes Schaub-litb

1
@Daniel,这就是我要表达而不是陈述的意思。关于差异,我可能还不够清楚,因此感谢您添加一些说明。
理查德

6

您可以将其重写为:

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

哪些功能与其他答案中所述相同。


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

6

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

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 在我的编译器中正确返回 ,这没有任何抱怨。
维尼修斯A.豪尔赫


3

它是条件运算符。

一种 ?:

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

表示:如果a为true,则返回b,否则返回c。在这种情况下,如果f == r,则返回1,否则返回0。


2

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.