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 printf
wyprowadza 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
?