-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 为什么它不是第二个增量运算符中 n 的增量值

这就是为什么emphasized()会发生一些有趣的事情。我试图想出一种方法,让提问者的文字代码按照他/她所说的去做。为此,我将其***emphasized text***视为源的一部分。

我的问题是:如何emphasized()进行更改以便在10 11 11不调用任何输出函数的情况下呈现输出?我希望观察一种方法来改变由printf()标准输出呈现的输出以添加空格但破坏最后一个数字。

由于此问题带有混淆标签,因此如果解决方案涉及添加更多#defines,请解决此问题。

4

4 回答 4

2

n递增到12n从未打印过,因此它的值无关紧要。

通过预处理器运行那个废话,你会明白为什么。

有一个#define使所有printf陈述无效。

实际输出来自putsin emphasized

于 2013-05-17T14:54:46.877 回答
1

n 增加了两次,它也被打印出来,正如你所期望的那样。

但是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 回答
1

这是原始代码:

#define text ();
#define printf(a,b) (void)0
#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;
}

这是通过预处理器运行后的代码:

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

请注意,这些printf语句不会出现在预处理代码中;在这个版本中, 的值n根本没有显示在控制台上。输出来自emphasized函数。

于 2013-05-17T15:27:26.117 回答
0

这是一个稍微不那么混淆的版本,它将每个printf()调用重新映射到最终构建输出的东西,如原始询问者所述。它稍微简单一些,因为它没有定义一个愚蠢的emphasized()函数。它还避免了不必要的取消引用argv,以避免在argc0 的情况下出现未定义的行为。

***emphasized text***此版本还具有这样的特性,即如果从程序中删除字符串,该程序也将像所描述的询问器那样运行。

#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 回答