Почему нам нужно указывать тип в спецификаторах формата в функции printf в C ++? - PullRequest
1 голос
/ 14 сентября 2011

Я сделал немного PHP, и когда вы объявляете переменные, вам не нужно объявлять тип (например, string или int).

Однако мне нужно настроить очень простой файл C и,чтобы заставить функцию печати работать правильно, я должен включить спецификатор типа для вывода каждой переменной.

Почему этот тип автоматически не выводится из самой переменной?

Ответы [ 3 ]

3 голосов
/ 22 сентября 2011

C - очень простой язык, под которым я подразумеваю, что он предлагает довольно минимальные абстракции по сравнению с голым металлом. Базовые типы поставляются с прикрепленной информацией типа no и даже struct s получают только информацию о типе , которую вы передаете им.

Так в типичной реализации, когда компилятор видит

int x, y;
float z;
int x = foo(y,z);

x, y и z, вероятно, представляют собой одно машинное слово, которое интерпретируется как целое число с дополнением 2s для x и `y, а также как значение с плавающей запятой IEEE-754 для z, и ничего больше .

Компилятор делает что-то вроде

  • передвигать указатель стека, чтобы освободить место для возвращаемого значения
  • push y и z в стек (в каком порядке это зависит от реализации)
  • push текущий stack pointer+two instructions в качестве обратного адреса
  • branch до точки входа foo.

(Достойные чипы обеспечивают некоторую поддержку, но все же ...)

Тогда Фу

  • читает y и z из их местоположений относительно текущего значения стека
  • делает с ними что угодно
  • записывает возврат в x (снова найден по смещению от указателя стека)
  • branch обратно на обратный адрес, который вызывает вызывающая подпрограмма push ed.

Если foo не было указано, какой тип имеют передаваемые аргументы (как в процедуре variadac, такой как printf), он не будет знать, насколько велик каждый аргумент в стеке (на самом деле c приводит размер каждого variadac аргумент с набором правил преобразования с повышением частоты, чтобы решить эту проблему), ни как его интерпретировать.

PHP, с другой стороны, предоставляет изощренную абстракцию над «голым» компьютером и может (фактически должен делать то, что он делает) с некоторой идентифицирующей информацией при каждом значении, с которым он работает.

2 голосов
/ 14 сентября 2011

Поскольку printf является частью C-совместимой части C ++, где определение типа не было таким горячим: -)

Существует разрыв между спецификаторами в строке формата и элементами данныхиспользуется для этого спецификатора, например:

printf ("String at memory %p is '%s'\n", mystr, mystr);
printf ("That character is '%c', ASCII code %d, hex %02x\n", mych, mych, mych);

Если вы используете потоки C ++ для вывода, это не такая большая проблема.

0 голосов
/ 14 сентября 2011

Наиболее распространенными спецификаторами являются:

% d /% i для целого числа
% c для char
% s для строки
% f для float /double

Например:

int i = 1;
char hi[6] = "Hello"
printf("%d %s", i, hi);

напечатает

1 Hello

, как указано выше, вы можете обратиться http://www.cplusplus.com/reference/clibrary/cstdio/printf/

...