2012-09-08 5 views
9

+演算子を使用せずに2つの数値を加算すると、次のコードが見つかりました。演算子を使用せずに2つの数値を加算する

3と4を追加するコード:

printf("%d",printf("%*c%*c",3,' ',4,' ')); 

printf()は結果 の文字数を返し、%*cそれが遭遇したことを次の文字を無視します。しかし、私はこのコードを理解することができません。どんな助けもありがとう。

+0

printf("%*d%*d", x, x, y, y); 

になります。 –

+0

私が知っている副作用は、入力として得られるスペースの数に従って出力をシフトすることです。他に何か ? – Peps0791

+3

しかし、その副作用は大きなものです。あなたは単にそれが追加を行うために奇妙な方法であると言うことはできません。 –

答えて

9

printf("%*c", n, c)は、文字c,n回を表示します。したがって、コードは3つのスペースとそれに続く4つのスペースを出力し、printfは明らかに3 + 4の問題を解決する文字数を返します。

+2

実際には、 'n 'のフィールド幅に右寄せされた文字' c'をスペースで埋めて印刷します。 (あなたの答えが示唆するように 'c'のコピーで埋められない) –

5

printfは3と4のスペースを出力し、7の文字数を返し、外側のprintfがその結果を出力しています。

1

標準のルールを指定するためにこの回答を追加しています。

戻り値printfを利用しています。それぞれ3-1個のスペース(' ')を入力してから、指定したとおりにスペースをもう一度入力し、4-1個のスペースをもう一度入力してください。そして、書き込まれた文字の総数が返されます。それが合計の仕組みです。

私はちょうど

printf("%*c",X,C) prints the char C in a field of size X 

このルールを覚えているすべてのこれらの行動は、C11標準で説明されています。標準 §7.21.6.1p4

から

オプションの最小フィールド幅。左側の変換値がフィールド幅より少ない 文字が含まれている場合、それは(デフォルト)スペースが埋め込まれているに に(または右は、後述する左調整フラグ場合、 が与えられています)フィールド幅。 フィールドの幅は、 アスタリスク(後で説明)*または非負の10進整数の形式をとります。

同じセク​​ションに §7.21.6.1p5

上述したように、フィールド幅、または精度、またはその両方が、 は、アスタリスクによって示されてもよいです。この場合、int引数は

fprintf関数は文字数が、又は 負の値を送信し返す最後§7.21.6.1.p14

フィールド幅または精度を供給する出力またはエンコーディングエラーが発生した場合


(あなたがフィールドのアイデアを得るように私はここに%dを使用しています)この例では、十分に良いだろう、あなたのアイデアをオフにします。

x = 10y=2場合、それは、コードはまた、いくつかの重要な副作用を有することがより明確に

| | | | | | | | |1|0| |2| 
1 2 3 4 5 6 7 8 9 10 \ \ 
         11 12 

That's how 12 characters are printed. 
関連する問題