Domyślne promocje argumentów w wywołaniach funkcji C

Ustawiać

Mam kilka pytań dotyczących domyślnych promocji argumentów podczas wywoływania funkcji w C. Oto sekcja 6.5.2.2 „Wywołania funkcji” Ustępy 6, 7 i 8 zStandard C99 (pdf) (podkreślenie zostało dodane i podzielone na listy, aby ułatwić czytanie):

Ustęp 6

Jeśli wyrażenie oznaczające wywoływaną funkcję ma typ, którynie zawiera prototypu, promocje liczby całkowitej są wykonywane dla każdego argumentu i argumentów, które mają typfloat są promowane dodouble. Są to tak zwanedomyślne promocje argumentów.Jeśli liczba argumentów nie jest równa liczbie parametrów, zachowanie jest niezdefiniowane.Jeśli funkcja jest zdefiniowana typem, tozawiera prototypi albo prototyp kończy się wielokropkiem (, ...) lub typy argumentów po promocji nie są zgodne z typami parametrów, zachowanie jest niezdefiniowane.Jeśli funkcja jest zdefiniowana typem, tonie zawiera prototypu, a typy argumentów po promocji nie są zgodne z parametrami po promocji, zachowanie jest niezdefiniowane, z wyjątkiem następujących przypadków:jeden typ promowany jest typem całkowitym ze znakiem, drugi typ promowany jest odpowiadającym typem całkowitym bez znaku, a wartość jest reprezentowana w obu typach;oba typy są wskaźnikami do kwalifikowanych lub niekwalifikowanych wersji typu znakowego lubvoid.

Ustęp 7

Jeśli wyrażenie oznaczające wywoływaną funkcję ma typ, któryzawiera prototyp, argumenty są niejawnie konwertowane, jak gdyby przez przypisanie, na typy odpowiednich parametrów, przyjmując, że typ każdego parametru jest niekwalifikowaną wersją zadeklarowanego typu.Notacja elipsy w prototypie funkcji deklaratora powoduje konwersję typu argumentu po ostatnim zadeklarowanym parametrze.Domyślne promocje argumentów są wykonywane na końcowych argumentach.

Ustęp 8

Żadne inne konwersje nie są wykonywane domyślnie; w szczególności liczba i typy argumentów nie są porównywane z parametrami w definicji funkcjinie zawiera deklaratora prototypów funkcji.Co wiemThedomyślne promocje argumentów sąchar ishort doint/unsigned int ifloat dodoubleOpcjonalne argumenty funkcji zmiennoprzecinkowych (jakprintf) podlegają domyślnym promocjom argumentów

Dla przypomnienia, moje zrozumienie aprototyp funkcji czy to jest:

void func(int a, char b, float c);  // Function prototype
void func(int a, char b, float c) { /* ... */ }  // Function definition
Pytanie

Naprawdę ciężko mi to wszystko pozbyć. Oto kilka pytań, które mam:

Czy zachowanie funkcji prototypowych i nie-prototypowych naprawdę różni się tak bardzo, na przykład w odniesieniu do promocji domyślnych i niejawnych konwersji?Kiedy pojawiają się promocje domyślnych argumentów? Czy to zawsze? Czy jest to tylko w szczególnych przypadkach (np. Z funkcjami zmiennymi)? Czy zależy to od tego, czy funkcja jest prototypowana?

questionAnswers(3)

yourAnswerToTheQuestion