2012-04-27 2 views
0

Я попытался выполнить поиск по старым вопросам, но я не решил свою проблему.рекламные объявления по умолчанию в случае неявных деклараций функций

Я стараюсь объяснить свои сомнения; Предположим, что для работы в режиме c89, если перед вызовом функции нет прототипа функции, существует неявное объявление функции, тип функции - int, и аргументы преобразуются с помощью аргументов по умолчанию:

Объекты типа char или short int (независимо от того, подписаны они или нет): , продвигаемые либо в int, либо без знака int, в зависимости от ситуации; и что объекты типа float предназначены для двойного типа.

Так что, если я пишу код, как это я согласен, что он должен работать:

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 и b повышаются до int, c удваиваются, а затем?

в случае b): там нет DAP, что происходит?

Итак, вопрос: когда после DAP или когда DAP не выполняется, тип аргументов не относится к одному типу параметров, какое правило применяется в случае неявных деклараций функций?

ответ

3

В обоих случаях нет правила. Обе программы демонстрируют неопределенное поведение.

В частности, в программе b DAP не применяется, поскольку значения, переданные в f, имеют тип long. Только char, short и float повышены.

Чтобы увидеть, что мощь произойдет, дают значения a, b и c в main и попробуйте напечатать эти (program a, program b).

+0

спасибо, что я сомневаюсь, потому что, если я вызываю f, проходящий через float, это продвигается в double, а f имеет аргумент типа float. У меня ошибка с компиляцией кода, но в 2 случаях у меня нет ошибок. – newbie

+0

Are вы уверены, что эти программы имеют неопределенное поведение? В прошлый раз, когда я читал стандарт, он говорил что-то, что звучало мне так, что если вы вызываете функцию 'int f (int a)' с аргументом 'long' (например,' x'), это произойдет, как если бы вы назначили 'int a = x;'. И присваивание будет неявно преобразовывать 'long' в' int'. Или я ошибаюсь? – Anthales

+0

Ах, извините, я понимаю, речь идет о неявной декларации - если она неявно объявлена ​​как «int f (long a)», но (внешне) определена «int f (int a)», да, это будет неопределенным. – Anthales