首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何直接操作输出流?(过去:为什么在c的情况下,它不是增量运算符的增量值?)

如何直接操作输出流?(过去:为什么在c的情况下,它不是增量运算符的增量值?)
EN

Stack Overflow用户
提问于 2013-05-17 14:47:43
回答 4查看 136关注 0票数 0

我修复了来自this question的代码,以便它能够编译:

代码语言:javascript
运行
复制
#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,请使用它。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-17 15:27:26

这是原始代码:

代码语言:javascript
运行
复制
#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;
}

下面是通过预处理程序运行的代码:

代码语言:javascript
运行
复制
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函数。

票数 1
EN

Stack Overflow用户

发布于 2013-05-17 14:54:46

n被增量为12,但是由于n从未被打印,所以它的值并不重要。

把这些垃圾通过预处理器,你就会明白原因了。

有一个#define,它空出所有的printf语句。

实际输出来自emphasized中的emphasized

票数 2
EN

Stack Overflow用户

发布于 2013-05-17 15:26:18

N是两次递增,也是打印出来的,与您预期的完全一样。

但是text#defined,它是一对括号和分号:();return&argv;return替换。

所以密码

代码语言:javascript
运行
复制
***emphasized text***
return 0;

变成:

代码语言:javascript
运行
复制
***emphasized();***
&argv;return 0;

或者稍微不那么奇怪的格式:

代码语言:javascript
运行
复制
***emphasized();
***&argv;
return 0;

所以printfs按照它们看起来要做的那样做,然后调用emphasized(),它用'\r‘(回车,没有行提要)备份光标,然后打印出101111。

所有星号只是为了显示,取消引用指针,但不使用结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16611911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档