2017-01-04 5 views
0

私は三項演算子( "?:")をif文として使用したいと思っています。正確には、(temp> 0)のように何かしたいのですが、何もしません。三項演算子をif文と同様に使う方法は?

  temp?i++:WHAT_SHOULD_COME_HERE_SO_NO_CHANGES_ARE_MADE_ANYWHERE 
+6

はその後三項演算子を使用していませんか...? – Li357

+0

'?'は 'if ... else'を表します。あなたが 'if'を持っているだけの場合' if(condition)action;を使用しない理由 ' – NathanOliver

+0

" else "部分を空白のままにすることはできません。 –

答えて

6

回答

は、厳密に言えば、あなたはこれを行うことはできません。第三オペランドに行かなければならない

(boolean expression) ? (returning expression) : /* no-op */; 

何かを。しかし、三項演算子を評価する事後条件の点で、無関係と行動的に同等の「何か」を作ることができます。下記参照。


三オペレータは値を返さなければならない

説明、及び種類は、第二及び第三のオペランドのそれぞれの戻り型のスーパータイプである最も派生型として推定されます。したがって、第3オペランドが空白の式(すなわち何も返さない)であれば、コンパイラは演算子全体の戻り値の型を推論することができない。したがって、コンパイルされません。三項演算子の使用


ソリューション

i = temp>0 ? i+1 : i; 

または

あなたが本当にしたい場合は、これはあなたが三項演算子を使ってそれを行う可能性がある方法です

temp>0 ? ++i : i; 

優先構文:あなたが探しているすべてのワンライナーであれば

は、次の構文が好ましいが:

if (temp>0) ++i; 
+0

2番目のオプションは、それを行うつもりなら、中括弧を取り除くだけです。また、最初の括弧は冗長であることに注意してください。 – Li357

+0

@AndrewLi特に、サブ式が複数演算子の式である場合は、かっこと中括弧を読みやすくするために慣れてきました。 (より良い視覚的描写)あなたが正しいとはいえ、この場合は当てはまりません。 – Travis

+0

気をつけて説明してください。 – Travis

2

3項演算子は式で使用されます。そのため、式全体を単一の値に評価する必要があります。つまり、 "if"と "else"の両方の句を指定する必要があります。 "else"部分を空白のままにする方法はありません。

さらに、このような式の中にインクリメント演算子を埋め込むことは、副作用の結果がエラーを起こしやすいのでお勧めできません。

4

これは動作します:

(void) ((temp>0)?i++:0); 

(void)はコードの動作を変更しないことに注意してください。むしろ、式の結果が故意に破棄されていることを読者(および/または今後呼び出されるスタイルチェックプログラム)に示すことがあります。それがなければ、コンパイラや他のプログラマがバグを疑い、あなたのコードを "修正"しようとする警告を受けるかもしれません。

実際には、上記のことはあなたがしようとしていることを表現する非常に珍しい方法なので、とにかくそれを得るかもしれません。他の人が理解し、維持するためにあなたの代わりに伝統的な形式を使用している場合、コードが容易になります。

if (temp>0) i++; 
+1

'void 'キャスティングのある部分は動作しません。キャストを使用する場合は、式全体をかっこで囲みます(ただし、醜いことになります)。 – anatolyg

+0

あなたは正しいです。私はかっこを追加しました。すでに醜いので、そこには何も失われませんでした。 –

0

次のことができます。

int temp = 20, i = 0; 

    (temp)? i++: i; 

    cout << i << endl;