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つの式は動作が全く異なりますが、日本語(文章)で説明できますか?
・補足にどう解釈したかを書いてみて下さい。
この回答への補足
まずは、回答ありがとうございます。
それと、私の勉強に付き合っていただきありがとうございます。
(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
と考えました。どうですか?
回答ありがとうございます。
出題していただいた問題を解いてみましたので、お時間あるときにでも、ぜひ正否を教えていただきたいです。
回答で示して頂いた例も、こんな使い方があるのかと、驚きました。未熟すぎな私ですが、プログラミングの幅が広がったと思います。
お時間を割いていただき本当にありがとうございます。
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 と打ち込んでみて下さい。
以上。
回答だけではなく、使用例や理解する為の問題まで考えていただいてありがとうございました。やっぱりプログラミングは実際に使ってみるのが一番ですね。大変勉強になりました。
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 にもない).
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のそれぞれの値も書いて下さい。
この回答への補足
(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;とおぼえてるんですが…。
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++;で、実行環境では、処理スピードも変化する場合もあります。
処理スピードは、コンパイラのオプティマイズに任せて、人から見た時に判りやすいコードを書くこと(コメントを多く)をお勧めします^^
回答ありがとうございます。
どこかでif文を多用すると処理が遅くなるという話を聞いたことがあって、それが頭の隅に残ってたんですが、そんなに気にすることでもないのですね^^)。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
【お題】引っかけ問題(締め切り10月27日(日)23時)
【大喜利】 「日本で一番高い山は富士山……ですが!」から始まった、それは当てられるわけ無いだろ!と思ったクイズの問題
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
0xffffとは?
C言語・C++・C#
-
DWORDの実際の型は何でしょうか
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
インタラクティブの反対語は?
-
エクセルで、日付を入力すると...
-
switch の範囲指定
-
お家デートをしててハグを長い...
-
【Excel】特定の文字を含むセル...
-
iD
-
EXCEL VBA マクロ 実行する度に...
-
メルカリのメルカードで買い物...
-
scanfやデーモンのような、whil...
-
Excelの関数が理解できない
-
DoEventsがやはり分からない
-
ビープ音を連続して鳴らす
-
VBAでループ内で使う変数名を可...
-
文字の点滅
-
コンボボックスの値判定
-
UMLでの例外処理
-
findは動くがfindnextがマクロ...
-
エクセルVBA マクロ処理中のポ...
-
取り消し線が入った文字を削除...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
switch の範囲指定
-
UMLでの例外処理
-
EXCEL VBA マクロ 実行する度に...
-
DoEventsがやはり分からない
-
メルカリのメルカードで買い物...
-
インタラクティブの反対語は?
-
月度は何て読みますか?
-
【Excel】特定の文字を含むセル...
-
findは動くがfindnextがマクロ...
-
VBの質問#if 0 then ってどう...
-
リョウ・・・量?料?
-
お家デートをしててハグを長い...
-
VB.NET Excelを読み込んでDataT...
-
iD
-
Do~Loopした回数をカウントしたい
-
FFTの結果ついて
-
2重のDo~Loopは?
おすすめ情報