Давайте посмотрим на ваш код:
#include <stdio.h>
int main (int argc, const char * argv[]) {
char out = printf("teststring");
printf("%d\n", out);
return 0;
}
и изменим его:
#include <stdio.h>
int main (int argc, const char * argv[]) {
const char *str = "teststring";
int out = printf("%s", str);
printf("\nPrintf wrote %d bytes when printing %s\n", out, str);
return 0;
}
Скомпилируйте / запустите отредактированную версию, и вы должны сразу увидеть разницу.Измените длину str
, затем скомпилируйте и запустите ее снова.
Теперь, просто небольшое изменение вашего исходного кода:
#include <stdio.h>
int main (int argc, const char * argv[]) {
char out = printf("teststring\n");
printf("%d\n", out);
return 0;
}
Теперь вы видите, что вы печатаете два разныхвещей, и out
стало 11, так как была добавлена новая строка.Здесь на самом деле ничего не тянется.Затем измените %d
на %c
(правильный формат для out
в вашем примере) и обратите внимание на разницу.ASCII (11) представляет собой вертикальную вкладку (см. здесь ).YTMV (ваш терминал может отличаться).Здесь вы печатаете символ, а не символьное представление целого числа.
Фактический тип , который возвращает printf()
, равен int
, что является целым числом.Причина этого в том, что вы точно знаете, сколько байтов printf()
фактически напечатано.Это типично для этого семейства функций, но более полезно для таких функций, как snprintf()
, поэтому вы можете узнать, не удалось ли вывести всю длину любого заданного формата в буфер.Обратите внимание, что тип возвращаемого значения подписан , он может быть отрицательным, поэтому тип хранилища, который вы выбираете для хранения его значения, имеет большое значение, особенно если вы работаете с этим значением, предполагая, чтоего значение больше или равно нулю.
Вот удобное руководство для форматирования спецификаторов, которые можно использовать с семейством функций printf()
.Что еще более важно, проверьте тип возвращаемых функций, которые вы используете.
Я также предлагаю провести некоторое время с этой книгой , не забывайте прорабатывать упражнения, если позволяет время.Это лучший курс для самостоятельного изучения языка Си, и упражнения - это весело.Когда вы получите полное представление о C, снова выполните упражнения ... затем сравните свои ответы, открывая глаза:)