Неявное преобразование в C? - PullRequest
3 голосов
/ 16 ноября 2010

Что здесь происходит:

printf("result = %d\n", 1);
printf("result = %f\n", 1);

выходы:

result = 1
result = 0.000000

Если я проверю тип этих переменных, прежде чем пытаться их напечатать, конечно, это будет нормально работать. Почему второй оператор печати не преобразуется неявно в 1.00000?

Ответы [ 5 ]

8 голосов
/ 16 ноября 2010

Во втором случае у вас есть несоответствие между строкой формата и типом аргумента - следовательно, результатом является неопределенное поведение (u) r.

4 голосов
/ 17 ноября 2010

Причина, по которой 1 не преобразуется в 1.0, заключается в том, что printf является «просто» функцией C с переменным числом аргументов, и только первый (обязательный) аргумент имеет указанный тип (const char *). Поэтому компилятор «не может» знать, что он должен преобразовывать «дополнительный» аргумент - он передается до того, как printf фактически прочитает строку формата и определит, что он должен получить число с плавающей запятой.

Теперь, по общему признанию, ваша строка формата является константой времени компиляции, и поэтому компилятор может сделать особый случай из printf и предупредить о неправильных аргументах ( как уже упоминали другие, некоторые компиляторы делают это, по крайней мере, если вы об этом попросите). Но в общем случае он не может знать конкретные форматы, используемые произвольными функциями vararg, и также возможно сложное форматирование строки формата (например, во время выполнения).

В заключение, если вы хотите передать определенный тип в качестве аргумента «переменная», вам необходимо привести его.

2 голосов
/ 16 ноября 2010

Неопределенное поведение.Int обрабатывается как float

1 голос
/ 16 ноября 2010

Короткий ответ: printf на самом деле не C ++.Printf - это функция C, которая принимает список переменных аргументов и применяет предоставленные аргументы к строке формата на основе типов, указанных в строке формата.

Если вы хотите какой-либо фактической проверки типа, вы должны использовать потокии строки - фактические C ++ альтернативы старому доброму printf в стиле C.

0 голосов
/ 16 ноября 2010

Интересно, предположительно, это нормально, если вы поставили '1,0'

Я полагаю, что printf получает только адрес переменной, но не знает, что это было.Но я бы подумал, что у компилятора хватит порядочности предупредить вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...