#はじめに
本にある記述が果たして正しいのかということが気になりました。
「Yahoo!知恵袋」などにも同じような質問はありましたが,満足する答えが得られませんでしたので,こちらで質問いたします。
#気になった本の記述
『やさしく学べるC言語入門[第2版]ー基礎から数値計算入門までー(皆本晃弥 著)』に複数の気になる記述がありました。
Amazon:やさしく学べるC言語入門[第2版]ー基礎から数値計算入門までー
###1. 「6.1関数の形式とmain関数」に次のような記述があります。
図6.1を見ると分かるように関数を利用するとプログラム全体の構造が見やすくなります.このように,プログラムの構造が見やすいのは,関数内部で別の関数を呼び出してはいますが,定義はしていないからです.そのため,C言語ではそのようなことを認めてはいません。
〈重要ポイント!〉
関数内部で別の関数は定義できない.
###2. 「6.4値渡しと参照渡し」に次のような記述があります。
このように値を返さない関数のことをvoid型関数と呼ぶときがあります。なお,void型関数は値を返さないのでプログラム6.2にあるようにreturn文を書いてはいけません。
c
1//プログラム6.2 2//値渡しだと値が変わらない例を示すプログラム 3#include<stdio.h> 4 5void swap(double x, double y); 6int main(void){ 7 double a=1.5, b=3.6; 8 //中略 9 return 0; 10} 11 12void swap(double x, double y){ 13 double tmp; 14 tmp = x; 15 x = y; 16 y = tmp; /*void型関数なので返り値はない*/ 17}
(//コメント
形式のコメントは私が追加でかいたもので,/* コメント */
形式は本に記されているコメントです。)
#テストしたソースコード
###1.「6.1関数の形式とmain関数」について
GCCで次のコードをコンパイルしましたところ,何のエラーも起きませんでした。(GCCバージョン: 4.9.3)
C
1#include<stdio.h> 2main(){ 3 int sum(int c, int d){ 4 return c+d; 5 } 6 printf("%d\n",sum(5,2)); 7}
実行結果は当然のことながら,
> .\a.exe 7
でした。
また,g++
では,
>g++ .\sono1.c .\sono1.c: In function 'int main()': .\sono1.c:4:23: error: a function-definition is not allowed here before '{' token int sum(int c, int d){ ^ .\sono1.c:7:23: error: 'sum' was not declared in this scope printf("%d\n",sum(5,2));
とコンパイルエラーになりました 。
###2.「6.4値渡しと参照渡し」について
書いてはいけないというのは誤りな気がします。たとえば,下記のコードのように,途中で無理やりreturn
したい場合などがあると思うからです。(この関数に何の意味がないですが・・・)
c
1void print_difference(int a,int b){ 2 if(b>a){ return; } 3 printf("%d",a-b); 4}
#質問事項
- コンパイラ,本のどちらが誤りなのでしょうか。
- JIS・ISOなどでの規定はどのようになっているでしょうか。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。