このプログラムの出力を手伝ってください。入力 3 4 に対して o/p PRINT 2 8 という結果が表示されるのはなぜですか
。
#include<stdio.h>
int main() {
int i,a;
printf("%d",printf("PRINT %d\t",scanf("%d%d,",&i,&a)));
return 1;
}
printf()
即時出力を実行します。印刷したばかりの文字列を「返す」ことはありません。出力された文字数(your)を返します7
。sprintf()
内側のプリントを外側のプリントにフィードする場合は、代わりに使用する必要があります。「文字列printf」。
欠けているのは、ネストされた関数呼び出しを含む1行は、基本的に次のコードと同じだと思います。
int scanf_result = scanf("%d%d,",&i,&a);
int printf_result = printf("PRINT %d\t", scanf_result));
printf("%d", printf_result);
scanf
有効な入力を入力した場合、呼び出しは2を返す必要がありますが、実際のエラーの場合は-1を返し、2つの整数のスキャンに失敗した場合は0または1を返すこともできます。次に、これは最初printf
に期待どおりに出力され、8(またはscanf
-1が返された場合は9)を返す必要があるため、7は実際に実行したコードと貼り付けたコードの違いを意味します...次に2番目printf
はその番号を出力します同じ行に(改行はどこにも印刷されません)、最終的な出力が得られます。
あいまいさはありません。コンパイラはここで異なる順序で処理を実行することはできません。関数の戻り値を引数として別の関数に渡す場合、戻り値を取得するには、最初に最初の関数を呼び出す必要があります。したがって、標準入力からの読み取りや標準出力への印刷などの「副作用」もこの順序で発生します。
あいまいさを得る方法は、同じ引数リスト内の同じ変数に対して代入演算子++
または演算子を複数回使用することです。--
次に、同じ引数リスト内で同じ変数を何度も使用すると、変数値が実際にいつ変更されるか、したがってどの値が渡されるかは未定義です。
Linuxprintf
やscanf
マニュアル ページなどの適切な C リファレンスには、これらの標準関数の戻り値が記載されており、戻り値を出力したときに表示される内容が説明されています。
この特定のケースでは、の戻り値scanf
は、正常に一致した入力項目の数です。各「入力項目」は文字列%
内のパターンに対応するscanf
ため、この場合scanf
、両方のパターンに対して有効な入力があった場合は 2 が返されます。次に、printf
出力した文字数を返します。strlen("PRINT ") == 6
(この場合、報告された出力は驚くべきものです。なぜなら、私は 8:と改行用の 1 文字とscanf
タブ用のもう 1 文字を期待していたからです。)
これらの値のいずれかがシステムごとに変化する理由はわかりませんが、もちろん、scanf
両方の入力項目を一致させることができなかった場合は変化します。