Ale co, jeśli chciałbym wydrukować ciąg, powiedz printf („witaj”), chociaż stwierdziłem, że nie kończy się na \ 0 następującą instrukcją
printf("%d", printf("hello"));
Output: 5
Mylisz się. To stwierdzenie nie potwierdza, że literał łańcucha "hello"nie kończy się znakiem kończącym zero '\0'. To stwierdzenie potwierdziło, że funkcja printfwyprowadza elementy łańcucha, dopóki nie zostanie napotkany znak kończący zero.
Gdy używasz literału ciągowego, jak w powyższej instrukcji, kompilator tworzy tablicę znaków o statycznym czasie przechowywania, który zawiera elementy literału ciągowego.
W rzeczywistości to wyrażenie
printf("hello")
jest przetwarzany przez kompilator w sposób podobny do następującego
static char string_literal_hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
printf( string_literal_hello );
Działanie funkcji printf w tym można sobie wyobrazić w następujący sposób
int printf( const char *string_literal )
{
int result = 0;
for ( ; *string_literal != '\0'; ++string_literal )
{
putchar( *string_literal );
++result;
}
return result;
}
Aby uzyskać liczbę znaków zapisanych w ciągu literowym „hello”, możesz uruchomić następujący program
#include <stdio.h>
int main(void)
{
char literal[] = "hello";
printf( "The size of the literal \"%s\" is %zu\n", literal, sizeof( literal ) );
return 0;
}
Wyjście programu to
The size of the literal "hello" is 6
);, co zamierzasz pokazać za pomocą tego kodu? Jak udowodniłeś, że to nie kończy się na\0?