Но что, если я захочу напечатать строку, произнесите printf ("привет") , хотя я обнаружил, что она не заканчивается на \ 0 следующим выражением
printf("%d", printf("hello"));
Output: 5
Вы не правы. Это утверждение не подтверждает, что строковый литерал "hello"
не заканчивается завершающим нулевым символом '\0'
. Это утверждение подтвердило, что функция printf
выводит элементы строки до тех пор, пока не встретится завершающий нулевой символ.
Когда вы используете строковый литерал, как в приведенном выше утверждении, компилятор создает массив символов со c продолжительность хранения, которая содержит элементы строкового литерала.
Так что на самом деле это выражение
printf("hello")
обрабатывается компилятором примерно так:
static char string_literal_hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
printf( string_literal_hello );
Th действие функции printf в этом вы можете представить следующим образом
int printf( const char *string_literal )
{
int result = 0;
for ( ; *string_literal != '\0'; ++string_literal )
{
putchar( *string_literal );
++result;
}
return result;
}
Чтобы получить количество символов, хранящихся в строковом литерале "hello", вы можете запустить следующую программу
#include <stdio.h>
int main(void)
{
char literal[] = "hello";
printf( "The size of the literal \"%s\" is %zu\n", literal, sizeof( literal ) );
return 0;
}
Вывод программы:
The size of the literal "hello" is 6