0

古い質問を検索しようとしましたが、問題は解決していません。

私は自分の疑問を説明しようとします。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が実行されない場合、引数のタイプが同じタイプのパラメーターではない場合、暗黙の関数宣言の場合にどのルールが適用されますか?

4

1 に答える 1

3

どちらの場合も、ルールはありません。どちらのプログラムも未定義の動作を示します。

f具体的には、プログラム b では、渡された値がtype であるため、DAP は適用されませんlongcharshortおよびのみfloatが昇格します。

起こるかを見るためにabcin に値を与えて、mainそれらを出力してみてください ( program a , program b )。

于 2012-04-27T20:13:52.407 に答える