Причина в том, что printf
не фактически заменяет "Hello %s", "World"
на "Hello World"
, а затем печатает их все. Вместо , он печатает "Hello "
, затем "World"
подряд каждый символ соло , в порядке
Если вы когда-либо пытались напечатать один null
символиспользуя putchar()
, вы заметите, что вместо этого он печатает пробел, поэтому printf
печатает пробел и на его основе.
Обратите внимание, что он напечатает ничего в других системах (например, Linux).
Пример кода того, как на самом деле работает printf.
const char * x;
// while the current char != '\0'
while (*format)
{
// if the current char == '%'
if (*format == '%')
{
// increment the pointer so we can point to the next char and skip printing '%'
switch (*(++format)) // then switch that next char (specifier).
{
case 'c':
putchar(va_arg(args, char)); // if the argument is null, then it's putchar(0);
break;
case 's':
// regular operation of printing a string argument.
x = va_arg(args, const char*);
while (*x) putchar(*x++);
break;
}
// skips the format specifier so we don't print it (e.g 's', 'c'..)
*format++;
}
// else: isn't a format specfier.
else
// print the current char (pointer) of the original string
putchar(*format++); // increments it for the next operation.
}
va_end(args);
Итак, возвращаясь к вашему вопросу,Он будет печатать каждый символ, а когда дело доходит до аргумента 0
, который равен null , putchar()
, либо ставит пробел, либо ничего на основе вашей системы.
Вы можете сказать, чтоprintf
аргументы не действительно не имеют никакого отношения к исходной строке, чтобы завершить ее, они не знают друг друга.
как, например, когда вы printf("Hello %s, from SO!", "World");
, "World"
на самом деле заканчивается в конце с \0
, но завершается только собой, а не другим , from SO!
.
Да , 0
это '\0'
.они одного персонажа.