古い質問を検索しようとしましたが、問題は解決していません。
私は自分の疑問を説明しようとします。c89モードで動作すると仮定すると、関数呼び出しの前に関数のプロトタイプがない場合、関数の暗黙の宣言があり、関数の型はでint
あり、引数はデフォルトの引数プロモーションによって変換されます。
タイプcharまたはshortint(signedかどうかに関係なく)のオブジェクトは、必要に応じてintまたはunsignedintにプロモートされます。そして、float型のオブジェクトはdouble型にプロモートされます。
したがって、このようなコードを記述した場合、それが機能する必要があることに同意します。
int main(void){
char a;
short b,c;
f(a,b,c);
return 0;
}
int f(int a,int b,int c){
return 1;
}
こっちも一緒:
int main(void){
float a;
short b,c;
f(a,b,c);
return 0;
}
int f(double a,int b,int c){
return 1;
}
しかし、なぜ次の2つのケースが機能するのかわかりません
/*a)*/
int main(void){
short a,b;
float c;
f(a,b,c);
return 0;
}
int f(long a,long b,long c){
return 1;
}
/*b)*/
int main(void){
long a,b,c;
f(a,b,c);
return 0;
}
int f(int a,double b,double c){
return 1;
}
a)の場合:aとbはintに昇格し、cはdoubleに昇格し、次に?
b)の場合:ここにDAPがない場合はどうなりますか?
したがって、問題は次のとおりです。DAPの後、またはDAPが実行されない場合、引数のタイプが同じタイプのパラメーターではない場合、暗黙の関数宣言の場合にどのルールが適用されますか?