-1

いいえを変更することで、printf関数の動作が異なることに気付きました。引数とフォーマット指定子の。次のコードを見てください。

#include<stdio.h>
void main()
{ int ji=65;
  printf("ji>=65 ? %d : %c",ji);
 }

出力はji>=65 になりますか? 65 : A
印刷された文字は A
しかし、コードが次の場合:

#include<stdio.h>
void main()
{ int ji=65,y;
  printf("ji>=65 ? %d : %c",ji);
  printf("%d",y)
}

この場合に出力される文字はheart(ascii value 3)で、yの値は12803です。

文字値がコンパイラによってどのように取得されているのか??? 助けてください

4

3 に答える 3

0

渡された引数の数がprintfフォーマット文字列の変換指定子の数よりも少ない場合、または引数の型が対応する変換指定子に対して正しくない場合、動作はundefinedであり、ほとんどすべての結果が可能であることを意味します。 (そして「正しい」と見なされます)。 その結果がどのように得られるかは、状況によって異なります。

に渡された引数printfの数が変換指定子の数より多い場合、追加の引数は評価されますが、それ以外の場合は無視されます。

のようなブロックスコープ変数yは、特定の値に暗黙的に初期化されないことに注意してください。それらの値は不確定printfであり、トラップ値でさえある可能性があるため、2 番目のステートメント に対して特定の出力を期待するべきではありません。

また、コンパイラのドキュメントに有効な署名として明示的にvoid main()記載されていない限り、未定義の動作も発生します。int main(void)代わりに 使用してください。

于 2013-02-12T17:53:24.553 に答える
0

スタックから取得されます。スタックから2つの引数を取得できることをprintfに伝えていますが、1つの引数しか提供していません。Printf はこれを認識せず、スタック上の次の値を取得します。これは、printf の呼び出し中に保存されたレジスタの値である可能性が最も高いです。

ただし、注意: 得られる値は常に未定義です。

于 2013-02-12T17:45:56.593 に答える