3

私は、The C programming Languagec を学ぶために K & R の本を読んでいます。それは言う

関数呼び出しの引数は式であるため、引数が関数に渡されるときにも型変換が行われます。関数プロトタイプがない場合、char と short は int になり、float は double になります。

過去数日間、この行を理解するのに苦労しています。重要なポイントだと思います。私がどんな仮定をしていても、それは実現していません。誰かがそれを明確に理解するのを手伝ってくれますか?

4

2 に答える 2

4

ANSI C より前のバージョンでは、プロトタイプのない関数を使用するのが一般的でした。この場合、デフォルト タイプの昇格のみが行われました。

プロトタイプがある場合、各パラメーター式は、キャストがあるかのように、関数が期待する型に変換されます。

// Declaration
void callMe(char x, int y);
...
// Call
callMe(50, 'x');

上記の呼び出しは、呼び出しと同等です

callMe((char)50, (int)'x');

これは、パラメーターの受け渡しに関する呼び出し元と呼び出し先の間の暗黙の合意のため重要です。パラメーターが渡される方法と、パラメーターのメモリ フットプリントは、型によって異なります。呼び出し元が正しい形式でパラメーターをメモリに配置しない場合、呼び出し先はパラメーターを正しく使用できません。そのため、両者は何らかの方法で各パラメーターの型に同意する必要があります。標準では、「合意」は関数プロトタイプの形で提供されるとされています。プロトタイプが欠落している場合、標準は「デフォルトの合意」をchar提供shortintます。floatdouble

于 2013-07-04T01:38:44.610 に答える
3

ここで重要なのは、通常の状況ではない「関数プロトタイプがない場合」です。この種の変換が見られる最も一般的な場所は、 のような関数への可変引数リストprintfです。

于 2013-07-04T01:37:28.037 に答える