#include<stdio.h>
void main()
{
printf(5+"good morning");/*need explanation for this line
return 0;
}
プログラムの出力は - 朝 どのように説明できますか?次のプログラムの出力の説明
#include<stdio.h>
void main()
{
printf(5+"good morning");/*need explanation for this line
return 0;
}
プログラムの出力は - 朝 どのように説明できますか?次のプログラムの出力の説明
プログラムの出力がある - 朝
printf(5+"good morning");
は最初の5つの文字をoverpassing " "
、内の文字列を出力します。したがって、最初の4文字はg
,o
,o
,d
、スペースは5番目の文字が上書きされ、残りの文字列が印刷されます。ここprintf
int printf(const char *format, ...);
format
の
プロトタイプは、リテラル文字列の最初のエレメントのアドレスにconst char*
のタイプとポイントです。 printf
に5+"Good morning"
を渡すと、実際に渡されているのは文字列のメモリアドレス+ 5
です。プラス5
は、印刷が文字列の開始を超えて5
chars
を開始し、単語「Good」の後の空白がcharとしてカウントされることを意味します。
5+"good morning"
でコールすると、パラメータがポインタに変換されます。つまり、実行可能ファイルのどこかに文字列定数"good morning"
が格納されており、コンパイラはそのポインタを渡します。このような何か:
const char txt[]="good morning\0";
printf(5+txt);
のでprintf
は、(1つのcharは8ビットWORDのアドレス指定のマシン上の単一BYTEと単一のメモリアドレスのように)文字列の最初の5つの文字をバイパスし、評価ポインタtxt+5
を取得します。
Printf()
方法は、()
のみ「朝」のテキストを印刷するために使用され、5+「G」「O」「O」「D」と初期5つの文字を迂回しました""(スペース)
Cへようこそ、私たちはここで難読化しています。次に、これが何をするのかを説明しよう: 'printf((char * const const const const)?<&5 ??(" good morning ":>%>);' – Lundin