#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);があるのかがわかりません!?
 よろしくお願いします。
 

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

A 回答 (2件)

たとえば、ご質問のコードだと



・プロトタイプを削除して
・関数呼び出しを

modori = kansuu(2.0);

(引数が、2.0 になっている点に注意)

とするだけで、予期しないことが発生します。
(プロトタイプがあれば、とりあえず、思った通りの結果にはなります)

この回答への補足

ご回答ありがとうございます。
 
 参考書には、このプログラムの項目に「引数を取る関数を作る」とあります。

このプログラムの全体的なことを理解しないと、ご回答を理解するには至らないと思います。
 なので暇暇勉強中です。
 ご返事までには、しばらく時間がかかりますのでご了承ください。

補足日時:2014/10/26 07:46
    • good
    • 0
この回答へのお礼

貴重なご回答まことにありがとうございました。
 
小数点になった場合有効になる^^
 なので、
 「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");
 無くても特に影響がなかったので、「余計」だと思い省きました。

 シンプルにして現在解析中です。 

 頑張りますので今後ともよろしくお願いいたします。

お礼日時:2014/10/31 04:45

C 言語ではプロトタイプ宣言なしに関数を呼び出したとき、その関数は int 値を返すと暗黙的に判断されます。

その暗黙の判断と後の方に出てくる関数の定義とがたまたま一致しているため、たまたま正常に動いているのです。
もし kansuu() の戻り値の型が int 以外ならこのコードはエラーとなっていたでしょう。

じゃあ戻り値が int の場合はプロトタイプ宣言はいらないんだなと思ったら大間違いです。繰り返しますがこのコードが正常に動いていたのはたまたまです。参考 URL のコードのような場合、プロトタイプ宣言がなかったら fac() はとんでもない値を返すことになります。

参考URL:http://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0% …

この回答への補足

ご回答ありがとうございます。
 
 参考書には、このプログラムの項目に「引数を取る関数を作る」とあります。

このプログラムの全体的なことを理解しないと、ご回答を理解するには至らないと思います。
 なので暇暇勉強中です。
 ご返事までには、しばらく時間がかかりますのでご了承ください。

補足日時:2014/10/26 07:46
    • good
    • 0

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

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

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つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

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文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Qint nII[10] = { 0 }について

久々にCを使ってプログラムを組んでいるのですが、基本的な構文を思い出せず
いくつか教えていただきたく質問させていただきました。

1)配列すべてを初期化するのに、宣言時に

int nII[10] = { 0 };

で大丈夫だった(全ての要素が0で初期化)と記憶しているのですが、間違いないでしょうか?

2)構造体の初期化は

struct tm tm;
memset(&tm, 0, sizeof(struct tm))

で大丈夫でしょうか?

3)構造体の宣言は

typedef struct{
int a;
}HOGE, *LPHOGE;

HOGE st; // <- struct HOGE stと同じ
LPHOGE pst; // <- struct HOGE* pstと同じ

で問題ないでしょうか?

以上、3つ質問になって申し訳ないのですが、よろしくお願いします。

Aベストアンサー

1)OK
2)たぶんOK
3)HOGEという名前の構造体はない(当該の構造体には名前がない)ので、
// 以下のコメント記述が誤っています。ただし、

HOGE st;
LPHOGE pst;
という定義そのものはOK

Qreturn 0; return 1; まで同じ

#include <stdio.h>
int main()
{
printf("%d %c\n", 65, 65);
return 0;
}
 コンパイル後は
65 A
 return 1;も同じでした。
しかし
 return 2;すると
 Exited: ExitFailure 2  終了しました:出口の失敗2 となります。
 2以上でしたら、出口が塞がるのでろうぐらいしかわかりません!?
 
 どんなバクなのでしょうか!?
 よろしくお願いします。

Aベストアンサー

C 言語の仕事は「0 なり 1 なり 2 なりを返す」までであり, その値にどう対処するかは (「C のプログラム」としては処理を完全に終了しているので) C のあずかり知らぬところです.

なので, 「どんなバクなのでしょうか!?」というのはあなたの使っている OS なりシェルなりなんなりに聞いてください.


人気Q&Aランキング

おすすめ情報