我修复了来自this question的代码,以便它能够编译:
#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()呈现的输出更改为标准输出,以添加空格,但将最后一个数字搞砸。
由于这个问题带有混淆的标签,如果解决方案涉及添加更多的#define,请使用它。
发布于 2013-05-17 15:27:26
这是原始代码:
#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-17 14:54:46
n被增量为12,但是由于n从未被打印,所以它的值并不重要。
把这些垃圾通过预处理器,你就会明白原因了。
有一个#define,它空出所有的printf语句。
实际输出来自emphasized中的emphasized。
发布于 2013-05-17 15:26:18
N是两次递增,也是打印出来的,与您预期的完全一样。
但是text是#defined,它是一对括号和分号:();,return被&argv;return替换。
所以密码
***emphasized text***
return 0;变成:
***emphasized();***
&argv;return 0;或者稍微不那么奇怪的格式:
***emphasized();
***&argv;
return 0;所以printfs按照它们看起来要做的那样做,然后调用emphasized(),它用'\r‘(回车,没有行提要)备份光标,然后打印出101111。
所有星号只是为了显示,取消引用指针,但不使用结果。
https://stackoverflow.com/questions/16611911
复制相似问题