プログラムの通常の流れは上~下でコンパイルされる?

このQ&Aのポイント
  • #プログラムの通常の流れは上~下でコンパイルされる?
  • プログラムの通常の流れは上から下へと順番に実行されるのが一般的ですが、コンパイラによっては最適化や最適順序のルールが存在することもあります。
  • プログラムの中には、関数の定義と呼び出しの間に定義がある場合、その定義部分は呼び出し部分よりも前にもってくることがあります。これにより、関数が正しく動作するようになります。
回答を見る
  • ベストアンサー

プログラムの通常の流れは上~下でコンパイルされる?

#include <stdio.h> int kansuu(int hikisuu1, int hikisuu2); int main() { int modori; modori = kansuu(2, 3); printf("modori = %d\n", modori); return 0; } int kansuu(int hikisuu1, int hikisuu2) { printf("kansuu de hyouji\n"); return hikisuu1 * hikisuu2; }  以上プログラムですが、 結果は以下です。 kansuu de hyouji modori = 6  素人の目からして! printf("modori = %d\n", modori);が  最初にあるので  以下がコンパイル結果になりそうですが!? modori = 6 kansuu de hyouji  この場合なぜ! kansuu de hyouji  が最初になるのでしょうか!?   よろしくお願いします。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.7

>  以下の使い方がいまいちわかりません? > printf("kansuu de hyouji\n"); > modori = hikisuu1 * hikisuu2; > printf("modori = %d\n", modori); 使い方というか、元のコードは関数の作成例だと思いますが、関数を利用しないで使ってる変数は利用するとして同じような流れだと以下のような感じでしょうか。 int main() { int modori; int hikisuu1; int hikisuu2; hikisuu1=2; hikisuu2=3; printf("kansuu de hyouji\n"); modori = hikisuu1 * hikisuu2; printf("modori = %d\n", modori); return 0; }

Campus2
質問者

お礼

毎度ご回答まことにありがとうございます。  同じ結果が得られました。 すばらしい。 kansuu de hyouji modori = 6    とても分かりやすいです。     最初のきむずい!プログラムと比較した場合、同じ結果ですが!  あえて!きむずいプログラムを使用した目的は!   複雑化していくプログラムの流れの中で、必要だからなのでしょう。    ご紹介していただいた、プログラムと比較しながら勉強したいと思います。    その他のスレッドのご回答いろいろありがとうございます。 今後とももよろしくお願いたいします。  

その他の回答 (6)

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.6
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

「コンパイル」と「実行」は区別してください.

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.4

>  この場合なぜ! > kansuu de hyouji >  が最初になるのでしょうか!? modori = kansuu(2, 3); でkansuuを呼び出していますからその中にある printf("kansuu de hyouji\n"); が実行されて knnsuuから抜けた後に printf("modori = %d\n", modori); が実行されますから kansuu de hyouji modori = 6 の順に表示されます。 kansuu(2, 3)のところにint kansuu(int hikisuu1, int hikisuu2)が展開されると考えてください。 printf("kansuu de hyouji\n"); modori = hikisuu1 * hikisuu2; printf("modori = %d\n", modori); と書かれているのと同じことになります。 ステップ実行してみるとどの順番で実行されていくか目視できますよ。

Campus2
質問者

補足

ご回答ありがとうございます。  以下の使い方がいまいちわかりません? printf("kansuu de hyouji\n"); modori = hikisuu1 * hikisuu2; printf("modori = %d\n", modori);     よろしくお願いします。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

では、素人考えなど止めて、正しいプログラミングを勉強しましょう。 分岐、ループ、呼び出し、ジャンプ等、実行順序が「上から順番」でないものが沢山あります。 それと、「コンパイル」は実行できるようにするための準備です。 コンパイルの順序と実行の順序は関係ありません。

noname#215107
noname#215107
回答No.2

それは、このような順番で書かれているからとしか言いようがありません modori = kansuu(2, 3); printf("modori = %d\n", modori); コンパイルの順番とプログラムの実行順は関係ありません。 この質問とは関係ないことですが、Cコンパイラは原則、ワンパスコンパイラですから上から下へ一回のみコンパイルされます。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

プログラムの基本がわかってないですね。 例えば、スケジュールで  9:00から5階で会議。 10:00から3階で仕事。 11:00から7階で撮影。 とかあったら 「ビルは5階と7階の間に3階はない」といいますか?

関連するQ&A

  • コンパイルの回答行の上下を入れ替えるには!

    #include <stdio.h> int kansuu(int hikisuu1, int hikisuu2); int main() { int modori; modori = kansuu(2, 3); printf("modori = %d\n", modori); return 0; } int kansuu(int hikisuu1, int hikisuu2) { printf("kansuu de hyouji\n"); return hikisuu1 * hikisuu2; }  以上のコンパイルの結果は  kansuu de hyouji modori = 6   ですが!  これを  modori = 6 kansuu de hyouji  にすることは可能でしょうか!?  よろしくお願いします。

  • modori = 17になる理由を教えてください。

    #include <stdio.h> int main() { int modori; modori = kansuu(2, 3); printf("modori = %d\n", modori); return 0; } int kansuu(int hikisuu1, int hikisuu2) { printf("kansuu de hyouji\n"); }  コンパイラーソフトは  http://codepad.org/KZDkVV1K  のネットで実施していまして!  これしかないです。    結果は kansuu de hyouji modori = 17  となりました。    皆様はコンパイラーソフトはOSにインストールしてお使いだと思います。 その場合も結果は同じでしょうか!?  もし同じでしたら、 modori = 17になる理由を教えてください。  以上よろしくお願いします。

  • 参考書にありますが削除しても結果は同じでした。

    #include <stdio.h> int kansuu(int hikisuu); int main() { int modori; modori = kansuu(2); printf("modori = %d\n", modori); return 0; } int kansuu(int hikisuu) { printf("kansuu de hyouji\n"); return hikisuu * 2; }  以上のプログラムは参考書の内容ですが、コンパイルした結果が、 kansuu de hyouji modori = 4  です。 二行目の   int kansuu(int hikisuu);がなくても、結果は同じでした。  参考書の説明では  「ここでは、関数kansuuの定義とプロトタイプ宣言に 、引数を追加しました。  引数の名前はhikisuuとして、int型の値を記憶できるようにしました。  int kansuu(int hikisuu); ←関数に引数を追加」  以上、  なぜ!参考書はint kansuu(int hikisuu);があるのかがわかりません!?  よろしくお願いします。  

  • 仕組みがいまいちですが!

    #include <stdio.h> int kansuu(int hikisuu1, int hikisuu0); int main() { int modori; modori = kansuu(2, 3); printf("modori = %d\n", modori); return 0; } int kansuu(int hikisuu1, int hikisuu2) { printf("kansuu de hyouji\n"); return hikisuu1 * hikisuu2; } 以上でが、コンパイルすると  kansuu de hyouji modori = 6  となり成り立ちますが!  int kansuu(int hikisuu0, int hikisuu1);  としても成り立ちます。 int kansuu(int hikisuu1, int hikisuu1);  にすると以下のエラーが出ます。 Line 2: error: redefinition of parameter 'hikisuu1' Line 2: error: previous definition of 'hikisuu1' was here    なぜerrorとなるのでしょうか  よろしくお願いします。

  • 正確なあ値でしょうか!?

    http://codepad.org/cBK5A67i を使って以下をコンパイルしたところ! No.1 #include <stdio.h> void kansuu(); int main() { kansuu(); return 0; } void kansuu() { printf("kansuu de hyouji\n"); No.2 }  #include <stdio.h> void kansuu(); int main() { kansuu(); } void kansuu() { printf("kansuu de hyouji\n");   return 0; } 以上の  コンパイルの結果はNo.1、No.2とも  kansuu de hyouji  となりました。    No.2の結果は   正確な値でしょうか  それともバグでしょうか?  よろしくお願いします。

  • コンパイル結果が違う

    コンパイル結果が違う C言語を勉強中の初心者です。 以下のプログラムをVC++6.0のCL.exeでコンパイルするとうまくいくのですが、VC++2010のCL.exeでコンパイルして実行すると、t2の値が0になってしまいます。 また、VC++2010でコンパイルした方が実行結果も遅いです。 #include <stdio.h> #include <time.h> int main(void) { int i = 1; time_t t1, t2; time(&t1); while(i <= 30000) printf("%d,", i++); time(&t2); printf("\ntime1=%ld time2=%ld\n", t1, t2); printf("かかった時間は、%d秒です\n", t2-t1); return 0; } vc++2010でコンパイルした方のt2の値が、0で表示されてしまうのはなぜでしょうか? よろしく、お願いします。

  • コンパイルエラー

    コンパイルしても、12行目(printf("%d番目の整数を入力してください。"i+1);が、関数呼び出しに)がないとでます。でもどこが間違っているか分かりません。 教えてください。お願いします。 #include <stdio.h> int main(void) { int num; int sum=0; int i; for(i=0; i<10; i++){ printf("%d番目の整数を入力してください。"i+1); scanf("%d", &num); sum+=num; } printf("合計は、%dです。\n", sum); return(0); }

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • C++のコンパイルエラーが

    おこります。 --------------------------------- #include <stdio.h> int main(void) { printf("hello, world\n"); return 0; } -------------------------------------- をコンパイルするのですができません。 以下のエラーが出ます。 --------------------------------------- エラー E2209 sample.c 1: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 sample.c 5: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) *** 1 errors in Compile *** -------------------------------------

  • cygwinのgccで正常にコンパイルできない。

    cygwinのgccで正常にコンパイルできない。 cygwinのvimで、以下のプログラムを書きました。 ------------------------------------------------------------- #include <stdio.h> int main(void) { int no; printf("Please input something:"); scanf("%d", &no); printf("It is %d that you input it:\n", no); return (0); } ------------------------------------------------------------- それからgccでコンパイルしました。 コマンドは以下の通りです。 $ gcc test.c すると以下のエラーが出ました。 test.c:10:9: warning: unknown escape sequence: '\033' このようにコンパイルできない状態です。 どのようにすると正常にコンパイルできるようになるでしょうか?

専門家に質問してみよう