「?」とは C ++で行いますか?


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

上記のスニペットで、「」はどういう意味ですか?何に置き換えることができますか?


22
もちろん、この特定のケースでは、return f == rに置き換えることができます。
Eclipse

6
@Eclipse:回避できれば、暗黙の変換bool-> intに依存しません。
ダニエルダラナス2009年

2
@DanielDaranasなぜですか?(これは一種の初心者の質問です
Michael Hoffmann

4
@MichaelHoffmannこの場合の暗黙的な変換の動作は明確に定義されているため、それを使用することは完全に正しいです。標準への参照については、この回答を参照してください。個人的には、暗黙の型変換を使用することは避けています。なぜなら、コードはより読みやすく、保守しやすく、暗黙の型変換がないとエラーが発生しにくいと思うからです。私はこのブログ投稿でそれについてより詳細に書いた。
ダニエルダラナス2015

回答:


135

これは一般に条件演算子と呼ばれ、次のように使用されます。

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;
  }
}

注:使用している言語で唯一の三項演算子(つまり、3つの引数を取る演算子)であるため、「三項演算子?:と呼ぶ人もいます。


4
通常のコードでは、これは構文糖衣ですが、コンストラクトの初期化リストで条件付き初期化を行うことができます。
JohnMcG 2009

Foo(Bar * y)pMember(y == NULL?NULL:y-> pMember)-ここでは、pMemberをyのpMemberに初期化します。存在しない場合は、NULLに初期化します。if-elseをコンストラクターの初期化に入れることができないため、三項演算子を使用すると可能になります。
JohnMcG 2010

@JohnMcG:そうですね、C ++ 11では、のa? b : c構文糖衣を検討できます[&]() -> Type { if (a) return b; else return c; }()
celtschk 2014

1
おそらく、しかし質問、回答、コメントは2009
。– JohnMcG 2014

15

これは三項演算子であり、基本的にインラインのifステートメントです。

x ? y : z

のように動作します

if(x) y else z

ただし、ステートメントの代わりに式があります。したがって、より複雑なステートメントの途中で使用できます。

簡潔なコードを書くのに役立ちますが、保守が難しいコードを作成するために使いすぎる可能性があります。


4
'?'にシーケンスポイントがあることを知っておく価値があります。これは、以下が有効であることを意味します:++ x?x:y;
Johannes Schaub-litb 2009

1
@Daniel、それは私がステートメントではなく式を持つことによって意味したことです。私はおそらく違いについて十分に明確ではなかったので、いくつかの説明を追加してくれてありがとう。
リチャード

6

次のように書き直すことができます。

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

これは他の回答で述べたのと同じことをします。


これにより、ブール値から整数への暗黙的な変換が実行されます
Don Cheadle 2015年

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.ホルヘ2015

5

これは条件演算子と呼ばれます。

次のように置き換えることができます。

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

3

これは条件演算子です。

?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;
}

これはおそらく最もクリーンな方法ではありませんが、理解に役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.