这是我的 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。
如果是嵌套的 printf
,打印指针的位置会被记住吗?我的意思是,如果 printf
里面有一个 \b
,它会使打印指针落后一步。当控件现在转到外部 printf
时,是否记住了那个改变的位置?它会覆盖最后一个字符吗?
最佳答案
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 语句导致控制跳转 past 声明 int x = 10;
,但进入声明 x
的范围。因此,调用 printf
时,x
未初始化。这会导致未定义的行为,并且很可能导致垃圾输出(我刚刚得到 -1217572876^H12
)。如果 x
恰好是 0
,我想你会得到 0^H2
,它看起来像 2
.
无论您想做什么,请找到更好的方法。
关于c - 为什么 printf ("%d\n"、 printf ("%d\b"、 a)) 以这种方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12638485/