• ベストアンサー

C言語のIFについて

IF文などの判定の時、真の方が処理が速い!とかあるのでしょうか。 また、プログラマーになるために参考になるサイトなどありましたら、教えてもらえないでしょうか。 ご教授の方、よろしくお願いします。

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

  • ベストアンサー
回答No.2

はい、if文の真と偽とでは処理の総時間が変わることが多々あります。 そんなことを気にしても、減らせる時間はまさしく微々たるものでしかない(うえ、下手すると論理的に分かりにくいソースコードになる)ので、回答者#1さんのおっしゃるように気にしないのが日常生活ではベストですが、勉強のためという意味で、ちょっと付け加えさせていただきます。 ジャンプ命令が来たとき、CPUは分岐予測を行います。この予測が当たれば早く操作を終わらせることが出来ますし、外れれば予測していない方をやり直すことになり、多少の時間ロスがあります。(詳細はCPU関係の話です。パイプラインとかそのあたり) 処理系によっては、どちらを予測した方がよいかというヒントをコンパイラに与えることが出来るものがあります。OSのソースコードでは、こういうものを見ることがあります。 ただ、普通のプログラムでは論理が見やすいようにすることの価値の方がif文なんぞのチューニングよりも圧倒的に高いです。というかif文のスピードの違いなんてアルゴリズムのチューニング効果やバグ減少効果と比較すればゼロと考えるべきです。 せっかくなら、プログラマという小さな目標ではなく、Hackerになろうとしてください。 http://cruel.org/freeware/hacker.html

その他の回答 (1)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

> IF文などの判定の時、真の方が処理が速い!とかあるのでしょうか。 処理系次第でしょうが「気にすることはない」と思います。 かなりシビアな環境でチューニングしてる場合を除けば、 「変わらないと思ってても十分」だと思います。 もし懸念がアセンブリレベルでの分岐ロスということであれば、 昨今の賢いコンパイラは最適化で勝手に条件を変えてるかもしれませんし、 それに任せる以上、C言語レベルで気にするのは不毛です。 (最適化を無効にするのは本末転倒ですし、 処理系を特定してチューニングするのもあまり賢いとは思えません)

関連するQ&A

  • C言語のif文について(初歩の初歩の初歩)

    if(num % 2) とするときnumが2で割り切れ「ない」とき つまり()内が「偽」であるときputsの文が表示されます。 if(num == 0) とするときnumが0のとき つまり()内が「真」であるときputsの文が表示されます。 ()内が非0になるか0になるかというのはわかるのですが 「真」か「偽」かでみると逆になってしまってわかりにくいので 常に if(num != 0) として0じゃ「ない」とき つまり()内が「偽」であるときputsの文を表示させれば 常に()内が「偽」のとき表示されるのでわかりやすいと思ったのですが この先これでやっていくとうまく行かないことが出てきますでしょうか。 簡単なうちに慣れていますべきでしょうか。 それともこのようにやっても問題ないのでしょうか。 皆様はどのようにしているのか教えてください。 よろしくおねがいします。

  • C言語 if文

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

  • あなたのC言語コーディング規約

    勤務先・学校・趣味でC言語を使用してプログラムをしている方の多くは組織内で決めているコーディング規約に沿ってプログラムをしていると思います。 しかし、全てに関して規約化されていることは少なく、ある程度プログラマの裁量に任せていることがあると思います。 そこで、質問です。 「あなたの中で決めているコーディング規約は何ですか?」 「また、その理由は何ですか?」 私が決めているコーディング規約を一例挙げると以下の通りです。 (基本は他人が見ても直ぐに理解できるように心がけてます。) ------ □変数名の前には必ず型を現す文字を書く 理由:観ただけで型が分かるから。 例 :int型は、iData    char配列は、stData    ポインタは、pData □関数の復帰値は、一旦必ず変数に代入する。 理由:代入しないとデバックがしにくい。 例 :iRetCode=func();    switch(iRetCode){      case文    }    の、ように色んな値を試すときに不便。 □if文には、極力「!」(NOT)は使用しない。 理由:複数の論理和・積などが入った場合ややこしいので    elseで代用する。(真の時の処理はわざと書かない) □if文の判定には必ず定数値を左辺に持ってくる。 理由:if(iData=0)とかの"=="を"="にしてしまうミスを防ぐため。    (コンパイラによっては、警告が出るものもありますが…) 例 :if(0=iData)など □while(1)は、基本的に使用しない。 理由:無限ループに陥らないようにするため。 ------

  • C言語を学びたい

    C言語を学び、エンジニアやプログラマーになりたいと思っています。 サイトで、学びたいのですが、無料で参考になるサイトが 有りましたら教えてください。 よろしく、お願いいたします。

  • C言語では0は・・・

    C言語では0をif文などで判定するときに 負の値になったら・・・という問題のときに 0は負の値に入るんでしょうか? それとも単純に-1とやるべきなのでしょうか コンパイルするとif(a<0)などでは0はもちろん含まないのですが -1にすると負の値として扱っているように見えるのですが、実際のところどうなんでしょうか もし負の値を入力されたら、というときに-1でいいのか0なのか。 ご回答お待ちしております

  • C言語のお作法 - ”{”の使い方

    C及びC++を学ばないまま、いきなりC#の学習始めました、というレベルの者です。 (下記は適当に引っ張ってきたコードです。) namespace HelloWorld { class Hello { static void Main() { System.Console.WriteLine("Hello World!"); } } } 見た限りどの本もウェブページも、こんな風に書くと"Hello Word!"が表示されます、と、 たいていはここから説明が始まります。 ですが、 ”{” はどのような意味があるのか、の説明が見つからず困っています。 もちろんなんとなくはわかるのですが、どういう時に使うか、 逆にどういう時は使わないか、がわからないのです。 例として、if文とswitch文での使い方で御教示いただければと思います。 if 条件式 { 処理1 } else { 処理2 } switch 条件式 { case 値1: 処理1 case 値2: 処理2 } if文の時はelse毎に囲むのに、switch文の時はcase毎には囲まない。 これは何故なのでしょうか?

  • 【C言語】if文内の演算子の優先順位について

    【C言語】if文内の演算子の優先順位について こんにちわ。初めて質問を投稿させて頂きます。 宜しくお願い致します。 【環境】 OS:Windows XP(SP3) コンパイラ:Visual C++ 6.0 CPU:AMD Athlon X2 4200+ 【質問】 私は下記のプログラムを実行しました --------------------------------- 【プログラム】 #include <stdio.h> int main( void ) { int i = 1; int j = 2; printf( "i = %d\n",i ); printf( "j = %d\n",j ); if( (i = 0) && (j = 200) == 200 ){ printf( "\n(1)-----------------------------\n" ); printf( "i = %d\n",i ); printf( "j = %d\n",j ); } printf( "\n(2)-----------------------------\n" ); printf( "i = %d\n",i ); printf( "j = %d\n",j ); return 0; } 【出力結果】 i = 1 j = 2 (2)----------------------------- i = 0 j = 2 //(※) --------------------------------- 私は【出力結果】(2)のj = 2という出力結果(上記(※)の行)は j = 200にならないとおかしいと思っております。 なぜなら、私は【プログラム】内のif文「if( (i = 0) && (j = 200) == 200 )」 の判定手順が下記の様になると考えているからです。  (1)i = 0を実行  (2)j = 200を実行  (3)(i = 0)の判定実行   →判定の結果「0」なので&&の右側の判定「(j = 200) == 200」    を行うまでも無くif文全体の判定がFALSE。 しかし、実際は「j = 200」が実行されてないので、上記(2)と(3)の 判定手順が逆転している様に見えます。 C言語の優先順位を見ると「&&」や「==」よりも「()」の方が高いと 記憶してるので、(2)→(3)の順に実行されないとおかしいと思ってます。 しかし、私の予想した結果と実際の出力結果が異なるので私の演算子の優先順位 やif文内での判定手順の理解に間違いがあると考えています。 出来ましたらどの点が間違っているのかご教授願えませんでしょうか? 宜しくお願い申し上げます。

  • シェルスクリプトのif文

    シェルスクリプトのif文について質問です。 あるファイルが存在しないときだけ処理を行いたい場合、 下記のような記述をするしかないのでしょうか? if [ -e /tmp/test.txt ]; then  ダミー処理(val1=1など意味のない処理)  (ダミー処理を入れるのは何も書かないとエラーとなってしまうため) else   行いたい処理 fi elseを使わずに if  fi だけですますことはできないでしょうか? -eはファイルが存在するならば真なので 逆に意味が真となるようにしたいのですが・・・

  • C言語プログラミング。

    標準出力から整数を読み込んで、その整数が奇数か偶数かを判定して、判定結果を出力するプログラムをif文を用いて作りたいんです。剰余演算子を使ってなら作れるんですけど、剰余演算子を使わないで作るにはどうすればいいのでしょうか。 よろしくおねがいします。

  • #if~#end ifについて

    #if~#end ifについて 下記文中にて、aが0以外の時に処理1をコンパイルするでよろしいでしょうか? それとも数値関係なしにaがdefineされている時に処理1をコンパイルするでしょうか? ご教授下さい。 よろしくお願い致します。 #define a 0 #if a 処理1 #end if

専門家に質問してみよう