2010-12-03 26 views
0

可能性の重複:
What does '?' do in C++?慣れない基本的なC++コード

xo = ((temp.npieces%2)==1)? 1 : 2; 

私は、これはそれの全体が何を意味するのかを把握することはできません。

XOは、整数(Iは単に無駄と交差との間の差を決定することと思う)

TEMPがnaughtsと交配ボードに関する情報を格納する位置のインスタンスである(naughtsのボード上の位置であり、十字架、ゲームの状態(それが勝利してきたかどうかすなわち、失われた、または未定)、そしてボード上に、これまでに設置個数

npiecesは、これまで

を置いピースの数を格納%2は、明らかに、n分割の残りを2で割ったものを決定して、t彼は奇妙なものでも、十字架でもいいのですか?

最後に私を混乱させる部分は、? 1 : 2ビットです。私はこのようなことを前に見たことがありますが、私はこれが何をしているのか分かりません。私はこれがかなり基本的なものだと知っていますが、大学2年目(2年目)にはかなり病気で、奇妙な断片を見逃してしまいました。

(これは私が取り組んでいる課題のコードの一部です - 数百行のコードを理解しようとしています。これが含まれています。これは割り当てであるため、私はですよりこの行が何を意味するのか正確には言わないでください。そして実際には? 1 : 2を説明するリソースの方向を指摘するだけで、私はそれを自分で解決できます。オンラインリソース、またはSafariで利用できる教科書の大きな章オンラインの本は非常に役に立ちます。もちろん、ここでは非常に簡単な説明です)

ありがとうございました。

不特定の質問のタイトルの謝罪は、よく知られていないコードが何をしているのかわからなくても、私はそれを表現するより良い方法を考えることができませんでした。

+1

これは、 'xo = 2 - (temp.npieces & 1);' – ruslik

+1

@ruslik:moduloを行うことを意図しているなら、 '2 - (temp.npieces%2)'がより明確になると思いますとにかくこの種の単純な最適化はコンパイラによって行われ、コードを読みにくくする傾向があります。 – ereOn

+0

真実は、3項演算子はキーワードaprioriを知らなくてもGoogleには難しいということです。 – ruslik

答えて

7
xo = ((temp.npieces%2)==1)? 1 : 2; 

temp.npieces場合があってもXOは現在2 他の賢明なXOに等しい(従って除算余りが0であること)は1に等しいです。

編集:それは奇数である場合、それはチェックしません、それは残りが1

X ? A : B 

if(X) 
{ 
    A 
}else 
{ 
    B 
} 

EDIT2を書くの別の方法である正であるかどうかをチェックします。

条件演算子の目的は、より速く、またはより重要ではありません。条件付き演算子は値を返します。 ifはありません。それは主な違いです。それは

+0

これはif文の非常に短縮版のようなものですか? – Eilidh

+0

はい。私はそれがより速いかどうかわからない。誰かが私に言った、しかし私は確信していません。 – Muggen

+1

'?'はそれが 'if'、 '1:2'が効果的に' answeriftrue:answeriffalse'と判断していますか? – Eilidh

5
bool ? 1 : 2 
(それは-145であっても)を0に等しくない場合 Therefore x ? A : B isn't exactly the same as if(x) { A; } else { B; }

クレジット@ジョンDiblingは


Cで何かが真であります

ternary operatorと呼ばれます。 boolが真の場合は1が返され、それ以外の場合は2が返されます。

+1

実際には三項演算子とは呼ばれません。それは3つのオペランドをとるC++の唯一の演算子です。実際には条件演算子と呼ばれます。名前 "三元演算子"は口語です。 –

1

このようにそれを読む:

if ((temp.npieces%2)==1)) 
xo = 1; 
else 
xo = 2; 

をnpiecesが奇数の場合は、2

2
xo = ((temp.npieces%2)==1)? 1 : 2; 

に影響を与える他のXOに1に影響を与えると同等です:

if((temp.npieces%2) == 1) 
    xo = 1; 
else 
    xo = 2; 
2

これは条件式であります。

それはそのように動作します:

  1. (temp.npieces%2)==1が評価されます。 temp.npiecesが奇数(かつ0より大きい)の場合、この式は真です。
  2. だけ評価値がtrueであれば、結果はすなわち、?後の最初の部分であり、それ以外の場合は1
  3. 、結果は最後の部分である、すなわち、2

あなたはこのコードを見ることができます

if ((temp.npieces%2)==1) 
    xo = 1; 
else 
    xo = 2; 

の省略形としての条件(temp.npieces%2)==1temp.npiecesが奇数の場合は本当にテストしないんのでご注意ください。 temp.npiecesの負の値については、(temp.npieces%2)==-1があります。したがって、temp.npiecesが署名されていない場合、このコードに問題がある可能性があります。

1

あなたは三元演算子を見ています。フォーム

variable = condition ? value-if-true : value-if-false 

の何かがtemp.npiecesが奇数のとき、今((temp.npieces%2)== 1)が真であることを行っている

if (condition) variable = value-if-true else variable = value-if-false 

のようなものの省略形です。

秘密のデコーダリングのような感じがしますが、Cの前には++があったので、3進演算子は周りにいました。