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で質問しましょう!
似たような質問が見つかりました
- 哲学 日本語は論理表現にふさわしくないか の問題です 4 2022/06/25 03:56
- 哲学 日本語は 言語類型として あたかも始原のごとくである 3 2022/05/29 04:41
- 高校 テスト勉強について 中間テストの結果がかえってきたのですがあまりよくありませんでした。 現代の国語と 2 2023/06/05 00:46
- 英語 英語勉強 4 2022/07/14 21:01
- 日本語 一家言という熟語は、現在もよく使われていますか? 4 2023/02/15 12:28
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- 日本語 意味とは何か? どこにあるのか?(Ⅱ) 4 2022/04/21 13:35
- 哲学 日本語のあたらしい文法を考えよう。 6 2022/06/25 17:41
- 大学受験 大学受験英語長文の勉強法について 武田塾のYouTubeなどを参考にして、勉強法を考えました 自分は 2 2023/05/05 08:05
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
このQ&Aを見た人はこんなQ&Aも見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
土曜の昼、学校帰りの昼メシの思い出
週休2日が当たり前の今では懐かしい思い出ですが、昔は土曜日も午前中まで学校や会社がある「半ドン」で、いつもよりちょっと早く家に帰って食べる昼ご飯が、なんだかちょっと特別に感じたものです。
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
0xffffとは?
C言語・C++・C#
-
#include <Windows.h>というヘッダファイルについて
C言語・C++・C#
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
EXCEL VBA マクロ 実行する度に...
-
UMLでの例外処理
-
switch の範囲指定
-
DoEventsがやはり分からない
-
vba 空のデータをSplitする時の...
-
インタラクティブの反対語は?
-
【Excel】特定の文字を含むセル...
-
findは動くがfindnextがマクロ...
-
Loadイベント中にほかのイベン...
-
VBの質問#if 0 then ってどう...
-
Do~Loopした回数をカウントしたい
-
VBAでセルに値が入力されるまで...
-
メルカリのメルカードで買い物...
-
リョウ・・・量?料?
-
月度は何て読みますか?
-
お家デートをしててハグを長い...
-
RPGプログラムの*HIVALについて
マンスリーランキングこのカテゴリの人気マンスリー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は?
おすすめ情報