这是我的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
s是记住打印指针的位置?我的意思是,如果内部\b
中有printf
,则打印指针会落后一步。当控件现在转到外部printf
时,记住改变的位置了吗?它会覆盖最后一个角色吗?
答案 0 :(得分: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
。
无论您想做什么,请找到更好的方法。