#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
 が最初になるのでしょうか!?
 
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/11/11 05:48
    • good
    • 0

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

    • good
    • 0

>  この場合なぜ!


> 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);

と書かれているのと同じことになります。

ステップ実行してみるとどの順番で実行されていくか目視できますよ。

この回答への補足

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

補足日時:2014/11/08 17:18
    • good
    • 0

では、素人考えなど止めて、正しいプログラミングを勉強しましょう。



分岐、ループ、呼び出し、ジャンプ等、実行順序が「上から順番」でないものが沢山あります。


それと、「コンパイル」は実行できるようにするための準備です。
コンパイルの順序と実行の順序は関係ありません。
    • good
    • 0

それは、このような順番で書かれているからとしか言いようがありません




modori = kansuu(2, 3);
printf("modori = %d\n", modori);




コンパイルの順番とプログラムの実行順は関係ありません。

この質問とは関係ないことですが、Cコンパイラは原則、ワンパスコンパイラですから上から下へ一回のみコンパイルされます。
    • good
    • 0

プログラムの基本がわかってないですね。



例えば、スケジュールで
 9:00から5階で会議。
10:00から3階で仕事。
11:00から7階で撮影。

とかあったら
「ビルは5階と7階の間に3階はない」といいますか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む


人気Q&Aランキング

おすすめ情報