• ベストアンサー

C言語 b += a ? 1 : 0; の意味

C言語を勉強中 b += a ? 1 : 0;  という1文があり??な状態になってしまいました。(+=、?:の意味はわかります。おそらく。) これは aが0以外ならb=b+1;、aが0ならb=b+0; (aは条件であり、bにたされるわけではない。)。if文より文が短く、処理も早い、という利点。 で間違いないですか? 自信を持って次に進みたいので、どなたか教えていただきたいと思います。お願いします。

質問者が選んだベストアンサー

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

★解釈は合っています。 >if文より文が短く、処理も早い、という利点。 で間違いないですか?  ↑  条件演算子(三項演算子)は『if』文を使わないため関数の引数や『for』文の式にも  記述できるメリットがあります。  私はマクロ関数などでは良く使います。  もちろん代入文とかでも使うこともあります。  多用すると分かりにくくなるため注意が必要かもしれませんね。 サンプル1: int i; for ( i = 0 ; i < (sw ? 100 : 200) ; i++ ){  : } ※変数『sw』の真偽により繰り返しの回数を100か、200に制御しています。 ※通常あまりこのような事はしませんが、for文の条件式として利用できます。 サンプル2: int sign; sign = ((value < 0) ? -1 : (value > 0) ? +1 : 0); ※変数『value』の符号情報を sign に -1、0、+1 をセットします。 ※このような使い方はマクロ関数を用意してたまに利用しています。 その他: >自信を持って次に進みたいので、どなたか教えていただきたいと思います。お願いします。  ↑  それなら1つ問題です。  (1)ans = (a ? b : c ? d : e);  (2)ans = (a ? b ? c : d : e);  この2つの式は動作が全く異なりますが、日本語(文章)で説明できますか? ・補足にどう解釈したかを書いてみて下さい。

kenrobo
質問者

お礼

回答ありがとうございます。 出題していただいた問題を解いてみましたので、お時間あるときにでも、ぜひ正否を教えていただきたいです。 回答で示して頂いた例も、こんな使い方があるのかと、驚きました。未熟すぎな私ですが、プログラミングの幅が広がったと思います。 お時間を割いていただき本当にありがとうございます。

kenrobo
質問者

補足

まずは、回答ありがとうございます。 それと、私の勉強に付き合っていただきありがとうございます。 (1) aが真ならb、aが偽ならc ? d : e            ↓   aが真ならans = b、aが偽かつcが真ならans = d、aが偽かつcも偽ならans   = eの3パターンに。 (2) aが真ならb ? c : d 、aが偽ならe            ↓   aが真かつbも真ならans = c、aが真かつbが偽ならans = d、aが偽ならans = e と考えました。どうですか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

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

★Tacosan さん、ご指摘ありがとうございます。  質問者さんへ訂正します。  間違い⇒なお ? の前は条件式ですので変数だけの場合はその内容が『真』=0、『偽』=0以外を判定します。  正しい⇒なお ? の前は条件式ですので変数だけの場合はその内容が『偽』=0、『真』=0以外を判定します。  ※良く見たら真偽が逆転していました。恥ずかしいです。ごめんなさい。 最終問題の解答: (a) (b) (ans)    (x) (y) (z) 真  真  ans = 1;  2  2  4 真  偽  ans = 1;  2  2  4 偽  真  ans = 2;  1  3  4 偽  偽  ans = 4;  1  2  5 こんな感じになります。 >if文より文が短く、処理も早い、という利点。 この記述は私がC言語を始めた最初のころに本に書かれていました。 今の時代はコンパイラの最適化が優れていますので処理が処理が早くなるかは分かりません。 >b += a ? 1 : 0; この場合は私も if を使って記述します。 その方が見やすいです。 ※昔は速度を気にして1つの変数を使いまわしたり、『resister』キーワードを付けていました。 ※最近はこんな小細工しなくてもCPU処理が全体的に高速処理してくれますのであまり気にしなくても ※良いです。それよりもループ処理に時間が掛からないようにアルゴリズムを見直すべきです。 ★最後に変わった使い方を紹介します。(普段はこんな使い方はしません) #include <stdio.h> #include <stdlib.h> // メイン関数 int main( void ) {  int a;    printf( "『CTRL-D』+『Enter』キーで終了します。\n" );    while ( scanf("%d",&a) == 1 ){   (a > 0) ? printf("(プラス)です。\n\n") :   (a < 0) ? printf("(マイナス)です。\n\n") : 0;  }  return 0; } キーボードから +1、-1、0 と打ち込んでみて下さい。 以上。

kenrobo
質問者

お礼

回答だけではなく、使用例や理解する為の問題まで考えていただいてありがとうございました。やっぱりプログラミングは実際に使ってみるのが一番ですね。大変勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

正直なはなし, 今どきの普通のコンパイラなら b += a ? 1 : 0; と if (a) ++b; の間に速度差があるとは思えないですね. 読み易さは明らかに後者の方が優れているので, 前者のように書く必要はないと思います. ちなみに挙げ足とりになって申し訳ないのですが「式の値が 0 なら偽, 0 でなければ真」ですね>#4. あとついでにいうと, C において 5+3 == 8 という式が条件判断に使えるように, 5+3 という式も条件判断に使えます>#3. 前者は「条件が成り立てば 1, 成り立たなければ 0」を返すだけです. true とか false などという高尚なものは C にはありません (ちなみに Pascal にもない).

kenrobo
質問者

お礼

訂正して頂いてありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★答え合わせ >(1) aが真ならb、aが偽ならc ? d : e  >          ↓ >  aが真ならans = b、aが偽かつcが真ならans = d、aが偽かつcも偽ならans   = eの3パターンに。 >(2) aが真ならb ? c : d 、aが偽ならe  >          ↓ >  aが真かつbも真ならans = c、aが真かつbが偽ならans = d、aが偽ならans = e >と考えました。どうですか?  ↑  正解です。 >(1)ans = (a ? b : c ? d : e); >(2)ans = (a ? b ? c : d : e);  ↑  これらはカッコを使うと分かりやすくなります。  ↓  (1)ans = (a ? b : (c ? d : e));  (2)ans = (a ? (b ? c : d) : e);  ※もし条件演算子で入れ子にする場合は積極的にカッコをいれた方が良いでしょう。  ※私はカッコを入れるタイプです。もちろん省略しても同じですが誰が見ても分かるようにしておく。 (1)の解答: (a) (c) (ans) 真  真  ans = b; 真  偽  ans = b; 偽  真  ans = d; 偽  偽  ans = e; (2)の解答: (a) (b) (ans) 真  真  ans = c; 真  偽  ans = d; 偽  真  ans = e; 偽  偽  ans = e; その他:  一覧として書き出せば良く分かります。  なお ? の前は条件式ですので変数だけの場合はその内容が『真』=0、『偽』=0以外を判定します。  分かっているとは思いますが、通常は関係演算子などと組み合わせて利用します。 ・最後にもう1つ問題です。  int x = 1;  int y = 2;  int z = 4;    ans = (a ? x++ : b ? y++ : z++);  このような場合はどうなるでしょうか? ・また補足に書いてみて下さい。  ans、x、y、zのそれぞれの値も書いて下さい。

kenrobo
質問者

補足

(a) (b) 真 真 ans=1,x=2,y=2,z=4 真 偽 ans=1,x=2,y=2,z=4 偽 真 ans=2,x=1,y=3,z=4 偽 偽 ans=4,x=1,y=2,z=5 でどうですか? たしかx++は式を評価したあとにx=x+1;とおぼえてるんですが…。

全文を見る
すると、全ての回答が全文表示されます。
  • V36GTR
  • ベストアンサー率34% (17/49)
回答No.3

おはようございます aが、0とか、0以外と理解しているようですが、三項条件文は、正確に言うと、aの条件が、trueか、falseです。 つまり、b+=(5+3)?1:0;という、書き方は、三項条件文では、間違いになります。正確には、b+=((5+3)==8)?1:0;が、正しい書き方になります。if分に置き換えると、 if (5+3==8) {   b=b+1; } else {   b=b+0; } と、理解しやすくなります。 それと、"if分より処理が早い"と言うのは、現代では、コンパイラ(C言語を解釈して、コンピュータが理解できるコードに変更する)の性能や、CPU(マルチコアや、キャッシュ)の性能によって、大幅に異なりますので、一概には言えません。 インクリメント演算子、一つをとっても、++i;と、i++;で、実行環境では、処理スピードも変化する場合もあります。 処理スピードは、コンパイラのオプティマイズに任せて、人から見た時に判りやすいコードを書くこと(コメントを多く)をお勧めします^^

kenrobo
質問者

お礼

回答ありがとうございます。 どこかでif文を多用すると処理が遅くなるという話を聞いたことがあって、それが頭の隅に残ってたんですが、そんなに気にすることでもないのですね^^)。

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>aが0以外ならb=b+1;、aが0ならb=b+0; (aは条件であり、bにたされるわけではない。) そう。 >if文より文が短く、処理も早い、という利点。 別に短かくはないでしょう if ( a ) b++; の方が明確だと思いますけど。

kenrobo
質問者

お礼

プログラミングは同じ働きでも書き方によって、見やすさや理解のしやすさが全く違ってくるということが実感できました。if(a) b++;はとても見やすく、わかりやすいですね。回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語について

    C言語でif文の条件指定の際、a > b && c > dとe > f && g > hのどちらかが成立すれば真という条件を書きたい場合、a > b && c > d || e > f && g > hという文では間違いですよね? どのように表記すればいいでしょうか? 解答よろしくお願いします。

  • if($a & $b) の意味

    phpでコーディングをしていますが、 初心者なので、よろしくお願いします。 コーディングの修正をしていますが、 if($a & $b) { 処理 } というコードが書かれたif文があり、 ifの()内の意味がわかりません。 C#では大体わかるのですが、 == なのか  != なのか インターネットで調べてもわからないので、 $a & $bの意味を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 【C言語】if文の条件式について

    基本的な質問で申し訳ございません。 C言語のif文にて、以下の条件式がよくわかりません。 if(a & PAD_INPUT_UP){ b = b-4; } 「&」はどのような意味になるのでしょうか??

  • C言語 if文

    C言語のif文についての質問なのですが、ifを使い、条件Aの時は1のプログラムを実行、条件Bの時は2のプログラムを実行するようにしたとき、1と2のプログラム自体にもif文が使われています。その場合は、AとBの時のifと1と2に使われているifをどのように区別するのですか?(ちなみに1と2のif文については、それぞれ実行してみたところ動作可能でした。)説明が下手ですいません。初心者ですので、分かりやすく教えていただけると有難いです。

  • メモリセルと変数 ( a = b + cの意味)

    メモリセルと変数の関係について勉強しています。 動的(non-static)なローカル変数 bとcが宣言されたあと、 次の文が 出現したとします。 int a = b + c; 問題を解いてるのですが、問題によると、 この文章で 変数とメモリセルが結びつく 機会を二つ答えよ。 「変数aの値が aのメモリセルに保存される」というのが、一つだと考えるのですが、もう一つが思いつきません。 変数bは "int a = b + c;" の以前に、宣言されているので、bとbのメモリセルはこの文より前に結びついてます。 同様にcも この文より前にメモリセルと結びついています。 考えられるのは、b + c なのですが、 a = b + c の意味が 「b+c の計算結果の値を a のメモリセルに 保存する」 という 答えが二つになります。 a = b +c の意味はこれでいいのでしょうか? 文章がわかりにくくてすみません。 要はa = b + cの本質的意味が知りたいのです。

  • c言語でif文の処理について

    お世話になります。 C言語を勉強中なのですが AとBが一緒でなおかつCとDが一緒ならば というif文を作りたいのですがどのように記載すればいいのでしょうか? よろしくお願いいたします。

  • C言語における定数の使用方法

    こんにちは。 今日質問したいのは、タイトルにありますように、C言語における「定数」の使い方についてです。 私は現在、Visual C++を用いてC言語のプログラミングを勉強しているのですが、条件文(if文)に定数を用いてコーディングを行おうとしても、どうしてもエラー表示が出て、うまくコンパイルすることができません。 具体的には、 if(No>=1 && No<=10){ //具体的な処理部分 } というif文を、予めヘッダファイル内にて定義した定数 #define start 1; #define stop 10; を用いて次のように、 if(No>=start && No<=stop){ //具体的な処理部分 } コーディングしたいと考えています。 しかし、これをコンパイルするとエラーが発生してしまいどうにもうまくいきません。 また、定数ではなく数字で記述するとうまく回ります。 別のところで定数を、 wk = start; のように代入で使用しているのですが、そこではなにも問題がありません。 いったい何が間違っているのか、どのようにすればうまくいくのかを教えていただきたいと考え、書き込ませていただきました。 皆様、どうぞよろしくお願いします。

  • 「AとBとCとが・・・」と言いたいときに・・

    「AとBとCとが利用される。そのうちAはxxxである」ということを1文で言いたいときに、 A is used, which is xxx , B, C. という言い方は許されますでしょうか? このような形の文を見かけた記憶があるのですが、意味が違うとしたら、どういう意味になりますでしょうか。。?

  • C言語

    今、独学でC言語を勉強しているんですが。 大きく、 条件処理、繰り返し処理、配列、関数、2次元配列、文字列、構造体、ファイル処理、乱数、検索、バブル・ソート、ポインタ まではやったんですが(参考書で勉強)。 その次になにを勉強したらよく分からないので、 何を勉強するべきか教えてください。 将来的にこれっと言った作りたいものは決めていません。 お願いします。

  • A∪C=B∪Cのとき、A=B?

    Can you conclude that A=B if A, B, and C are sets such that (もしA, B, Cが下記のような集合であった場合、A=Bと結論付けられるか?) a)A∪C=B∪C? b)A∩C=B∩C? という問題なんですがヒントが欲しいです。 まず、何をすればよいのでしょうか? A=B=Xと仮定して、X∪C=X∪C、よし両辺とも等しい、終了(^_^)/~ …なんてことはないですね?(笑) Unionの定義を使って (X∈A∨X∈C)≡(X∈B∨X∈C)としたとしてもその次はどうすればいいのか…。 最初の一歩を教えて下されば、あとは自分でサラサラサラ~と解いてみせますので どうかその一歩を教えて下さい。

このQ&Aのポイント
  • 試用期間中の窓口業務を担当している私が退職を悩んでいます。
  • 母の介護のために退職を決めましたが、まだまだ業務が未熟で不安です。
  • 人員不足の中でパニックになり、毎日が恐い状況です。アドバイスをお願いします。
回答を見る