2009-11-03 3 views

ответ

5

В любом случае это не будет листинг, а переинтерпретация (например, получение адреса, указатель другого типа, а затем получение содержимого в виде нового типа).

Пример:

printf("%d\n", 1.5); 

не будет печатать целое 1, но целое значение представления 1.5 в IEEE 754. Если вы хотите бросить, вы должны явно поместить (int) перед значением.

+0

Как выглядит 1,5 в IEEE 754? – root

+3

На самом деле, поскольку вы вызываете ** Undefined Behavior **, он может делать что угодно. Он может печатать «сорок два» или форматировать ваш жесткий диск. – pmg

+2

@pmg хорошо, поведение не определено, но предсказуемо ... странные вещи могут быть, если вы попытаетесь интерпретировать более крупный тип как меньший, но двойной (как 1.5) по крайней мере такой же большой, как int (в обоих 32 и 64-битные архитектуры, я не знаю, что будет с будущими). В этом случае на моей машине он печатает только 0, из-за эндианн Intel, он занимает нижнюю часть 1.5, которая, как оказалось, равна нулю. По-моему, в большой эндианской машине он напечатал бы «1073217536». – fortran

5

Нет, это часть строки спецификатора формата для первого аргумента функции printf(); строка формата. Он напечатает десятичное представление того, что вы передали в качестве второго аргумента.

5

Это не так. Это просто «подсказка» для функции printf() для обработки аргумента «a» как «int»

0

Нет, это спецификатор формата. Он имеет смысловое значение только для форматированных функций ввода-вывода и не является частью языка C. Вы могли бы также написать yopur own

Все, что он делает, это определение «читаемого человеком» представления, в котором можно представить значение int; нет преобразования или перевода типа.

2

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

Когда вы передаете строку формата printf(), вы сообщаете функции, что ожидать в ее списке аргументов (обычно в стеке), но это может не совпадать с тем, что вы на самом деле положили. С помощью% d вы сообщаете printf(), чтобы взять следующий набор байтов байтов из целочисленного размера из списка аргументов и отформатировать эти байты, как если бы они представляли десятичное число со знаком. Поэтому, когда Е() разбирает строку формата и встречает% D, это будет, вероятно, сделать что-то вроде:

int num = va_arg(args, int); 

А затем форматировать и выводить байты «номер», как если бы они были целым числом, независимо от того, вид аргумента вы фактически прошло. Если вы поместите float в аргументы, в которых printf() будет предложено ожидать целое число, результат будет десятичным представлением байтов с плавающей запятой IEEE - возможно, не то, что вы намеревались, а не то, что бы сделал настоящий бросок.

Смежные вопросы