3

这是我的 C 代码,用 gcc 编译。

#include<stdio.h>

int main() 
{ 
    int a=1; 
    switch(a)
    {
       int x=10;
       case 1:
           printf("%d\n",printf("%d\b",x));
           break;
       default:
           printf("%d\n",printf("%d\b",x));
    }
    return 0;
}

printf() 应该返回它成功打印的元素数。 printf("%d\b", x)应该自己打印 10(因为 \b 将打印指针落后一步(到 10 中的数字 0)并且之后没有任何内容可打印。所以它应该只打印 10。那是 2 个字符。现在外部 printf 将显示 2。输出应该是 102。我实际看到的输出是 2。

在嵌套printfs 的情况下,是否记住了打印指针的位置?我的意思是,如果\b内部有 a printf,它将使打印指针落后一步。当控件现在转到外部printf时,是否记住了更改的位置?它会覆盖最后一个字符吗?

4

1 回答 1

5
printf("%d\b",x)

打印字符'1', '0'(因为 x==10) 和\b. \b是退格字符;如果您打印到终端,它将打印10然后将光标移回一列。

调用printf返回它打印的字符数;在这种情况下,结果是 3(是的,'\b'算作一个字符)。

printf("%d\n",printf("%d\b",x));

内部printf调用如我上面解释的那样工作,并返回 3。外部printf调用打印"3\n"

所以整个语句将打印:

10\b3\n

'\b'导致在屏幕上3被替换0,所以最终显示的结果(当我在我的系统上运行程序时)是:

13

如果我通过管道输出cat -v,我得到:

10^H3

其中^H表示退格字符。

编辑 :

这个问题刚刚被编辑,修改后的程序的行为是完全不同的。switch 语句使控制跳过声明,但进入声明int x = 10;的范围x。结果,在被调用x时是未初始化printf的。这会导致未定义的行为,并且很可能是垃圾输出(我刚刚得到-1217572876^H12)。如果x碰巧是0,我想你会得到0^H2,看起来像2

无论你想做什么,请找到更好的方法来做。

于 2012-09-28T11:08:56.830 回答