Я попытался выполнить поиск по старым вопросам, но я не решил свою проблему.рекламные объявления по умолчанию в случае неявных деклараций функций
Я стараюсь объяснить свои сомнения; Предположим, что для работы в режиме 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 не выполняется, тип аргументов не относится к одному типу параметров, какое правило применяется в случае неявных деклараций функций?
спасибо, что я сомневаюсь, потому что, если я вызываю f, проходящий через float, это продвигается в double, а f имеет аргумент типа float. У меня ошибка с компиляцией кода, но в 2 случаях у меня нет ошибок. – newbie
Are вы уверены, что эти программы имеют неопределенное поведение? В прошлый раз, когда я читал стандарт, он говорил что-то, что звучало мне так, что если вы вызываете функцию 'int f (int a)' с аргументом 'long' (например,' x'), это произойдет, как если бы вы назначили 'int a = x;'. И присваивание будет неявно преобразовывать 'long' в' int'. Или я ошибаюсь? – Anthales
Ах, извините, я понимаю, речь идет о неявной декларации - если она неявно объявлена как «int f (long a)», но (внешне) определена «int f (int a)», да, это будет неопределенным. – Anthales