しかし、文字列を印刷したい場合は、printf( "hello")と言いますが、次のステートメントで\ 0で終わっていないことがわかりました
printf("%d", printf("hello"));
Output: 5
あなたは間違っている。このステートメントは、文字列リテラル"hello"
が終端のゼロ文字で終わっていないことを確認しません'\0'
。このステートメントは、関数printf
が終了ゼロ文字に遭遇するまで文字列の要素を出力することを確認しました。
上記のステートメントのように文字列リテラルを使用している場合、コンパイラーは、文字列リテラルの要素を含む静的ストレージ期間を持つ文字配列を作成します。
だから実際にはこの表現
printf("hello")
次のようなコンパイラによって処理されます
static char string_literal_hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
printf( string_literal_hello );
これにおける関数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
);
はそのコードで何を示すつもりですか?で終わらないことをどのように証明しました\0
か?