• 締切済み

? : の使い方

?と:の使い方がわかりません。 http://www9.plala.or.jp/sgwr-t/c/sec14.html#s14-3 この辺を見てみると、1つだけ「?」が書いてある文なら理解できたのですが、複数あるとどうなるのかよくわかりません。 たとえば・・ int a=2,b; b = (a==1) ? (a==2) ? 11 : 12 : 13; こんな時です。 どのとき、どこの値が入るのでしょうか。 よろしくお願いします。

みんなの回答

  • ryumei
  • ベストアンサー率60% (3/5)
回答No.4

No.1とNo.2の方がすでに理解の仕方は答えておられるので?:についてですが…(半角では見辛いのであえて全角で書いています) (条件)?(条件が真である場合):(条件が偽である場合) といった簡易的なif文のようなものです。 当然、入れ子に対応していますので、 (条件が真である場合)もしくは(条件が偽である場合) にも同じように?:にて条件を分けることが可能です。 >int a=2,b; >b = (a==1) ? (a==2) ? 11 : 12 : 13; 上記例の場合をif文で表しますと、 int a=2,b; if( a==1 ){ if( a==2 ){ b=11; }else{ b=12; } }else{ b=13; } という風に分解することができます。 ただ…余談になりますが実際にコーディングしていく上では?:を使う機会は少ないかもしれません。 (組み込み機器等の性能に限りがある場合は使うことはありますが…大きなプロジェクトのチーム開発などでは他の開発者が理解しづらいコードは書かないことが鉄則になりますので大抵はわかりやすいif-else文を使います)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★回答 ・回答者 No.2 さんと同じです。カッコを付けてみよう。 ・『条件演算子』は『条件式 ? 式1 : 式2』の3つをセットで評価します。 ・よって、『条件式 ? 式1 : 式2』の部分にカッコを追加すれば理解しやすくなります。 考え: ・カッコを付けると『b = (a==1) ? ((a==2)?11:12) : 13;』となります。 ・まず『(a==1)』で『((a==2)?11:12)』と『13』に分岐します。 →『a=2』なので『13』が『b』に代入されます。 ・また、『a=1』ならば。 ・『((a==2)?11:12)』が評価されるため、『(a==2)』で『11』と『12』に分岐します。 →『a=1』なので『12』が『b』に代入されます。 結論: ・『b』には『13』が代入されますよ。 ・『条件演算子』は『条件式 ? 式1 : 式2』の3つをカッコでくくると理解しやすいです。 ・『条件演算子』が多重であっても基本は『条件式 ? 式1 : 式2』の3つですからね。

  • K_Senryu
  • ベストアンサー率100% (6/6)
回答No.2

b = (a==1) ? ((a==2) ? 11 : 12) : 13; カッコをつけて、こんな感じにするとわかりやすい…かも。 aが1のときはカッコの中を評価して、それ以外のときは~~、と 順に読んでいけば理解できると思います。

noname#22058
noname#22058
回答No.1

bの値を出力するコードを書くとわかります。

関連するQ&A

  • C言語の構造体

    組込み系でマイコンにソフトをプログラミングの仕事をしています。 C言語は初心者です。 http://www9.plala.or.jp/sgwr-t/c/sec15.html のページの冒頭に、 「構造体は幾つかの異なる型のデータをまとめて 1つのデータ型として扱うものなのです。」と書かれています。 1つのデータ型として扱うとどのようなメリットがあるのでしょうか? 例えば、 struct seiseki seito1; のように対象が1つ(seito1)なら int seito1_no; char  seito1_name[20]; double seito1_average; と変数を確保すれば済むのに、 何故、構造体で宣言するのでしょうか? 例えば、 struct seiseki seito2[20]; のように、似たものが複数ある場合は(seito2が20人分なるなら、) 構造体で宣言する意味があるとはなんとなくわかります。 後ページの http://www9.plala.or.jp/sgwr-t/c/sec15-4.html では、関数でのやり取りが書かれています。 関数で引数や返値で扱うときに構造体にしておいた方が良いからでしょうか? 構造体のメリットというのが今一わかりません。 対象が1つでも構造体で書いた方がいろんな意味で良いのでしょうか? 如何せん、初心者なので質問がうまく書けませんがご了承ください。 ※上から目線的な回答はご遠慮願います。

  • ビット演算を学びたい

    a &= 2; a |= 2; a ^= 2; a ~= 2; a <<=2; a >>=2; みたいな感じでビット演算が使われているソースを 良く見るのですが、いまいちビット演算で何をしているのかが 分かりません。 参考書などには文字通りビットをいじるような旨のことが書いてあります。 (こちらにも同じようなことが http://www9.plala.or.jp/sgwr-t/c/sec14.html) こういうので何となくは分かるのですが、 実際にこれを何に使えるか、実践ではどのように使うのかが なかなか見えてきません。 このビット演算を私のような者でも実際のプログラムで使いこなせるように なれるようなサイトや書籍の提示、あるいはサンプルのプログラムなどで ご指導いただけたらと思います。

  • リスト構造

    1→2→3のようにポインタでリスト構造を作るとき、最後の3は何もさしていないのですが、初期化もせずNULLも代入しない状態で使っても問題無いのでしょうか? プログラムはちゃんと動くようですが。 このコードがそれにあたると思うのですが。 http://www9.plala.or.jp/sgwr-t/c/A/rei15-5.html

  • ポインタのポインタの必要性

    書物によるとポインタのポインタの使用例として「ポインタの配列」はポインタを使ってアクセスすることができます。」[*]とありますが、どうしてポインタのポインタが必要なのかがいまいちピンと来ません。 どういう場合なのかを知りたく思っています。 [*]サンプルスクリプト ===================================================== char *mnthp[3] = {/* ポインタの配列の宣言 */ "January", "February", "March" }; char **p1;/* 「ポインタのポインタ」の宣言 */ int i, j; p1=mnthp;/* 「ポインタのポインタ」にポインタの配列 */ /* の先頭番地を設定 */ /***** 例1 *****/ for (i = 0; i < 3; i++) {/* 「ポインタのポインタ」の値を変えずに */ printf("%s\n", *(p1 + i));/* 相対的に文字列を出力 */ } ==> このようなことをしなくとも printf("%s", mnthp[i]); で値を参照出来ると思われる。 ===================================================== [*] http://www9.plala.or.jp/sgwr-t/c/sec10-4.html 宜しくお願い致します。

  • C語でenumの使い方

    http://www9.plala.or.jp/sgwr-t/c/sec16.html の下部に enum week { SUN, MON, TUE, WED, THU, FRI, SAT }; int main(void) { enum week w;   /* ⇒列挙型 week で変数 w を宣言 */ w = MON; /* ⇒変数 w に列挙定数 MON を代入 */ と書かれています。 列挙型 week で変数 w を宣言するのはどういうときに メリットがありますか? 普通にunsigned char w と何が違うのでしょうか?

  • c言語で分からないところがあるので教えてください。

    http://www9.plala.or.jp/sgwr-t/c/Q/ens06-61.html の問題がわかりません。 回答の #include <stdio.h> int main( void ) { int kekka[51]; int a, b, i; int amari; printf( "整数値を2つ入力してください " ); scanf( "%d%d", &a, &b ); if( b == 0 ){ printf( "処理終了\n" ); return 0; } printf( "%d / %d = ", a, b ); kekka[0] = a/b; for ( i = 1; i < 51;i++ ) { amari = a%b; if ( amari == 0 ) break; a = amari * 10; kekka[i] = a/b; } printf( "%d.", kekka[0] ); ここまでの部分はわかったのですが、 下の for ( a = 1; a < i; a++ ) { printf( "%d", kekka[a] ); } の部分がわかりません。 この部分は何を表わしているのか 教えてください。

  • C言語の&に関する質問

    C言語で if (x == 0.0) (いろいろな計算) return x < 0.0 && (n & 1) ? -ans : ans; というプログラムがあるのですが、 最後のreturnのところで x がゼロ以下で且つ、n &1の場合には -ansを返し、そうでない場合にはansを返すとあるのですが、 n&1というのはどういう意味なのでしょうか? C言語で&と言えば、 http://www9.plala.or.jp/sgwr-t/c/sec14.html のページにあるように、ビットごとの AND演算子ですが、 この場合にはどういう意味で使われているのでしょうか?

  • キーボードからの入力

    http://www9.plala.or.jp/sgwr-t/c/Q/ens15-41.html 安全性を考えて上のページの問題の入力をscanfではなくfgetsを用いての入力で行いたいのですが、いまいち方法が分かりません。 いろいろ試してみたのですが上手くいかないのでヒントをいただけないでしょうか?よろしくお願いします。 17:59分に投稿したものはURLが間違っていたので無視して下さい。 大変申し訳ありませんでした。

  • ベクトルと平面図形

    三角形OABにおいて、辺OAを 1 : s ( >0) に内分する点をP, 辺OB を 1 : t ( >0) に内分する点を Q とする。線分BP と AQ の交点を R とする。 (1)OR ベクトルを a ベクトル = OA ベクトル , b ベクトル = OB ベクトル s , t を用いて表せ。 (2)線分 OR が角 AOB を2等分するとき、 s : t を | a ベクトル | , | b ベクトル | を用いて表せ。 という問題なのですが、(1)は理解できて、 OR ベクトル = t * a ベクトル / ( st + s + t ) + s * b ベクトル / ( st + s + t ) となるのですが、(2)の解答は次のようになっています。 (解答)「 直線 OR と 辺 AB との交点を D とする。 このとき、 k を実数として、OD ベクトル = kOR ベクトル とおける。 よって OD ベクトル = k { t * a ベクトル / ( st + s + t ) + s * b ベクトル / ( st + s + t ) } 点 D は辺 AB 上の点であるから kt / (st + s + t)+ ks / (st + s + t)= 1 ゆえに k = (st + s + t)/ (s + t) よって OD ベクトル = t * a ベクトル / (s+t)+s * b ベクトル / (s+t) したがって AD : DB = s / (s + t) : t / (s + t)= s : t ・・・(3) また、線分 OD が角 AOB を2等分することから AD : DB = OA : OB = |aベクトル| : |bベクトル| ・・・(4) (3)、(4)から s : t = |aベクトル| : |bベクトル| 」 となっているのですが、 自分の解答では 「 直線 OR と 辺 AB との交点を D とする。  線分 OD は角 AOB の二等分線であるから、 OA : OB= AD : DB すなわち 1 + s : 1 + t = |aベクトル|:|bベクトル| よって、s : t = |aベクトル|:|bベクトル| 」 という解答になりました。なにか間違っているような気もするんですが、いまいち何が間違っているのかわかりません。どなたかわかる方ご教授願えませんでしょうか?

  • 2ちゃんで住所特定?

    今日こんな書きこみ見ました。 男のいき遅れスレです。 男性と女性が荒れて喧嘩していました。 すると男性がこんなもの書きました。 HOST:i114-184-135-233.s05.a010.ap.plala.or.jp HOST:i114-184-135-233.s05.a010.ap.plala.or.jp HOST:i114-184-135-233.s05.a010.ap.plala.or.jp 群馬ババアのホストw こういうのってスレ建て本人にはSAGEでも見えるのですか? スレ建てぬしホストにはIP分かるのですか? これでは書き込みが減りますね。