-1

この質問のコードを修正して、コンパイルできるようにしました。

#define text ();
#define return &argv;return
int *** emphasized () {
    static int x, *argv = &x, **xpp = &argv;
    puts("\r10 11 11");
    return &xpp;
}
int main (int argc, char *argv[]) {
  int a;
    int n = 10;
    printf("%d",n);
      n++;
    printf("%d",n);
     a = n++;
    printf("%d",n);***emphasized text***
    return 0;
}

元の質問で、質問者は次のように述べました。

Output= 10 11 11 2 番目のインクリメント演算子で n のインクリメント値ではない理由

emphasized()それが何か面白いことをする理由です。私は、質問者のリテラルコードを使用して、彼/彼女が言ったことを実行させる方法を考え出そうとしていました。***emphasized text***そのために、 をソースの一部として扱いました。

私の質問は次のとおりです。出力関数を呼び出さずに出力をemphasized()レンダリングするように変更するにはどうすればよいですか? 10 11 11によってレンダリングされた出力を標準出力に変更してスペースを追加する方法を観察したいと考えてprintf()いますが、最後の数字は無効にします。

この質問には難読化のラベルが付けられているため、解決策に を追加する必要がある場合は、それを試し#defineてください。

4

4 に答える 4

2

nにインクリメントされます12が、n印刷されないため、その値は重要ではありません。

そのがらくたをプリプロセッサで実行すると、その理由がわかります。

#defineすべてのprintfステートメントを無効にする があります。

実際の出力はputsinから取得されemphasizedます。

于 2013-05-17T14:54:46.877 に答える
1

n は 2 回インクリメントされ、期待どおりに出力されます。

しかし、かっことセミコロンのペアである必要がありました: text、およびに置き換えられます#defined();return&argv;return

だからコード

***emphasized text***
return 0;

になります:

***emphasized();***
&argv;return 0;

または少し奇妙にフォーマットされていません:

***emphasized();
***&argv;
return 0;

そのため、printfs は実行しようとしているように見えることを正確に実行してからemphasized()呼び出され、'\r' (キャリッジ リターン、ライン フィードなし) でカーソルをバックアップし、10 11 11 を出力します。

すべてのアスタリスクは単なる表示用であり、ポインターを逆参照しますが、結果は使用しません。

于 2013-05-17T15:26:18.050 に答える
0

printf()これは、元の質問者が説明したように、最終的に出力を構築する何かに各呼び出しを再マップする、やや難読化されていないバージョンです。emphasized()ばかげた関数を定義していないので、少し単純です。また、が 0argvの場合に未定義の動作を回避するために、を不必要に逆参照することも回避します。argc

***emphasized text***このバージョンでは、プログラムから文字列を削除すると、プログラムも asker の記述どおりに動作するという特性があります。

#include <stdio.h>
#define printf(f,x) printf(x>11?"%d\n":"%d ", x>11?x-1:x);
#define emphasized &argv;
#define text if(0)
#define return &argv;return
int main (int argc, char *argv[]) {
  int a;
    int n = 10;
    printf("%d",n);
      n++;
    printf("%d",n);
     a = n++;
    printf("%d",n);***emphasized text***
    return 0;
}
于 2013-05-22T22:32:35.200 に答える