なぜ参考書にint kansuu(int hikisuu);があるのかがわからない
- プログラムに関数kansuuの定義とプロトタイプ宣言がありますが、結果は同じです。
- 参考書の説明によると、引数を追加した関数kansuuの定義とプロトタイプ宣言があるとあります。
- なぜ参考書にint kansuu(int hikisuu);があるのかがわからない。
- ベストアンサー
参考書にありますが削除しても結果は同じでした。
#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);があるのかがわかりません!? よろしくお願いします。
- Campus2
- お礼率47% (226/475)
- C・C++・C#
- 回答数2
- ありがとう数7
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
たとえば、ご質問のコードだと ・プロトタイプを削除して ・関数呼び出しを modori = kansuu(2.0); (引数が、2.0 になっている点に注意) とするだけで、予期しないことが発生します。 (プロトタイプがあれば、とりあえず、思った通りの結果にはなります)
その他の回答 (1)
- hitomura
- ベストアンサー率48% (325/664)
C 言語ではプロトタイプ宣言なしに関数を呼び出したとき、その関数は int 値を返すと暗黙的に判断されます。その暗黙の判断と後の方に出てくる関数の定義とがたまたま一致しているため、たまたま正常に動いているのです。 もし kansuu() の戻り値の型が int 以外ならこのコードはエラーとなっていたでしょう。 じゃあ戻り値が int の場合はプロトタイプ宣言はいらないんだなと思ったら大間違いです。繰り返しますがこのコードが正常に動いていたのはたまたまです。参考 URL のコードのような場合、プロトタイプ宣言がなかったら fac() はとんでもない値を返すことになります。
補足
ご回答ありがとうございます。 参考書には、このプログラムの項目に「引数を取る関数を作る」とあります。 このプログラムの全体的なことを理解しないと、ご回答を理解するには至らないと思います。 なので暇暇勉強中です。 ご返事までには、しばらく時間がかかりますのでご了承ください。
関連する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 にすることは可能でしょうか!? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- プログラムの通常の流れは上~下でコンパイルされる?
#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 が最初になるのでしょうか!? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 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になる理由を教えてください。 以上よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 仕組みがいまいちですが!
#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となるのでしょうか よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 正確なあ値でしょうか!?
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・C++・C#
- どちらの説明をしているのかがわかりません?
http://okwave.jp/qa/q8798932.html の の中に int kansuu(int hikisuu); ←関数に引数を追加 がありますが! ”関数に引数を追加”の説明で、”関数”とは!intのことを言っているのか、それとも kansuuを言っているのかが分かりません? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 関数プロトタイプ無しで、引数が float の場合
またまた float がらみでつまずています。 以下のようなソース(2つのファイルに分割されています)を実行すると、 f = 2.000000 と表示されました。 test1.c で、func() のプロトタイプを書いてないのが諸悪の根源だとは思うのですが(警告もでています)プロトタイプの役割は、 ・引数の型の不整合がないようにする ・必要に応じて、仮引数と実引数の型変換を発生させる だと思います。 このソースでは(たまたまですが)引数の型もあっているので、正常に実行できそうな気がするのですが、なぜ、結果がおかしくなってしまうのでしょうか。 確かに、プロトタイプがないのは好ましくはないですが。 test1.c に、int func(float f); を追加したときには、確かに f = 0.010000 と表示されます。 また、f と func() の引数を double にしたときには、プロトタイプがなくても、正常に実行されます。 ----- test1.c ------------- int main() { float f = 0.01; func(f); return 0; } ----- test2.c ------------- #include <stdio.h> int func(float f) { printf("f = %f", f); return 0; } ----- ここまで ------------
- ベストアンサー
- C・C++・C#
- 関数のアドレスをコピーすることについて
◎1--------------------------- #include<stdio.h> void (*putdata)(int d); //// (1) //// void english(int dt); void japanese(int dt); int main( ) { int a=234; putdata=english; putdata(a); putdata=japanese; putdata(a); return 0; } void english(int dt) { printf("Value is %d.\n",dt); } void japanese(int dt) { printf("数値は%dです.\n",dt); } --------------------------------- ◎2-------------------------------- #include<stdio.h> int (*get_sign) ( ); //// (2) //// int iget_sign(int *a); int dget_sign(double *a); int main( ) { int sgn,idt=6; double fdt=-2.123; get_sign=iget_sign; sgn=get_sign(&idt); printf("data:%d sgn:%d\n",idt,sgn); get_sign=dget_sign; sgn=get_sign(&fdt); printf("data:%f sgn:%d\n",fdt,sgn); return 0; } int iget_sign(int *a) { if(*a==0) return 0; else if(*a>0) return 1; else return -1; } int dget_sign(double *a) { if(*a==0.0) return 0; else if(*a>0.0) return 1; else return -1; } --------------------------------- 以上2つのプログラムについて疑問があります。 ◎1の「putdata=english;」と関数のアドレスをコピーするにおいて、(1)の部分の引数の「(int d)」がどういう意味があるか分かりません。 次に◎2の(2)の部分で、「int (*get_sign) ( );」と引数を空にするというのが理解できません。本当は(2)の部分を、「int (*get_sign)(void *a);」 にしなくてはいけないと参考書に書いてあったのですが、何故そうしなくてはいけないかも理解できません。 C++で実行すると、チェックが厳しいということで、エラーが出てしまうというのは、参考書には書いてあったのですが、その前に(1)、(2)での関数プロトタイプの引数の表現方法が理解できません。 教えていただけると嬉しいです。
- ベストアンサー
- C・C++・C#
- 警告 W8065について。
このプログラムを実行したら、実行結果は思い通りになったのですが、 「警告 W8065…プロトタイプのない関数」 と言うのが出ました。 (1)これを消すにはどうすればよいのかを教えてください。 (2)このプログラムはわざと4つに分けているのでこの状態のままプログラムのどこをいじればよいのかを教えてください。 OSはWindows XPでボーランドのコンパイラを使用しています。 #include<stdio.h> int hiki(); int kake(); int waru(); int main(){ int a,b; printf("一つ目の数字\n"); scanf("%d",&a); printf("二つ目の数字\n"); scanf("%d",&b); printf("計%d\n",a+b); hiki(); return 0; } int hiki (){ int c,d; printf("一つ目の数字\n"); scanf("%d",&c); printf("二つ目の数字\n"); scanf("%d",&d); printf("計%d\n",c-d); kake(); return 0; } int kake (){ int e,f; printf("一つ目の数字\n"); scanf("%d",&e); printf("二つ目の数字\n"); scanf("%d",&f); printf("計%d\n",e*f); waru(); return 0; } int waru (){ int g,h; printf("一つ目の数字\n"); scanf("%d",&g); printf("二つ目の数字\n"); scanf("%d",&h); printf("計%d\n",g/h); return 0; }
- ベストアンサー
- C・C++・C#
お礼
貴重なご回答まことにありがとうございました。 小数点になった場合有効になる^^ なので、 「int kansuu(int hikisuu);の部分は!省かないほうが無難」だとわかりまし。 以上 なぜそうなるのかいまだに理解に苦しんでいるところですが! 掲示板のご回答など 現在の私のレベルだと説明されてもまだそれを理解するスキルがないです。 なので、 参考書を読んでも、奥が深いので、分からないのが多いです。 現在、私が有力視しているプログラムのスキルアップは! 1)掲示板に質問して少しでも何かを得ること 2)プログラムをいじることにより、コンパイルの結果がどうなるかを、見極めながら、プログラムの構文 の役割を知る 以上2件です。 #include <stdio.h> int A(int B, int C); int main() { int D; D = A(1.0,2.0); printf("(1)= %d\n", D); return 0; } int A(int E, int F) { return 2 * 3; } 結果は (1)= 6 以上ですが printf("kansuu de hyouji\n"); 無くても特に影響がなかったので、「余計」だと思い省きました。 シンプルにして現在解析中です。 頑張りますので今後ともよろしくお願いいたします。
補足
ご回答ありがとうございます。 参考書には、このプログラムの項目に「引数を取る関数を作る」とあります。 このプログラムの全体的なことを理解しないと、ご回答を理解するには至らないと思います。 なので暇暇勉強中です。 ご返事までには、しばらく時間がかかりますのでご了承ください。