0

printfがプログラムの最初の2つの割り当ての値を取ることをどこかで読みました。printfはいくつでも指定できます。それらはすべて、最初の2つの値のみを取ります。プログラムで指定された割り当ての数が多い場合、printfはガベージ値を取ります。

私はそうは思いませんが、それは多くのウェブサイトで与えられたので、それを確認する必要があります

たとえば、単純なGoogle検索を実行すると、次のような"printf takes first two assignment as input"サンプルの面接の質問/回答があるサイトがあります。

次の出力またはエラーを予測します。

main()
{
    int i=400,j=300;
    printf("%d..%d");
}

回答:400..300

説明:printfは、プログラムの最初の2つの割り当ての値を取ります。printfはいくつでも指定できます。

それらはすべて、最初の2つの値のみを取ります。プログラムで指定された割り当ての数が多い場合、printfはガベージ値を取ります。

これは正しい本当の振る舞いですか?それとも実装に依存しますか?

このようなQ&Aの場所は次のように見つけることができます:
このパズルサイト
このインタビューの質問ドキュメント

4

2 に答える 2

5

いいえ、それは間違いなく真実ではありません。

コンテキストについては、C11 7.21.6.3/2をお読みください。

この関数は、printfの引数の前に引数を挿入したprintf場合と同等です。fprintfstdout

したがって、標準から、C11 7.21.6.1/2:

このfprintf関数は、後続の引数が出力用に変換される方法を指定するformatが指す文字列の制御下で、streamが指すストリームに出力を書き込みます。フォーマットの引数が不十分な場合、動作は定義されていません。[...]

(強調鉱山)

発生する可能性があるのは、スタックからの値がprintf()呼び出されたときにプルされる可能性があることです。繰り返しになりますが、動作が定義されていないため、ガベージ値の印刷やプログラムのクラッシュから、ネイバーのパラレルプリンタでのケーキ画像の印刷まで、何が起こる可能性があります(実際には何でも)。

特定の実装(特定のCPUアーキテクチャ、特定のコンパイラ、場合によっては特定のオペレーティングシステム)で特定のケースが実行可能であると文書化されていない限り、実行しないでください

パズルサイトの「パズル」は、ほとんどの場合、未定義の動作と、実装で定義された動作に関する誤った仮定の組み合わせです。いくつかの例は正しいですが、それがほとんど悪いことを考えると、私はそれを見たことがないふりをします。ランダムなインターネットサイトは、プログラミング、特にCを学ぶための悪いリソースになる傾向があります。Cを学びたい場合は、Cプログラミングに関する適切な本を入手する必要があります(リストはここにあります)。

于 2013-01-15T18:36:04.783 に答える
2

これは正しい本当の振る舞いですか?それとも実装に依存しますか?

それは未定義の動作です。何が起こるかについての保証はまったくありません。

の省略記号...メカニズムの実装の可能性Cは、コンパイラとオプティマイザにも依存しますが、質問で示す特定の評価をもたらす可能性があります。

于 2013-01-15T18:36:21.987 に答える