[英]Why does printf(“%d\n”, printf(“%d\b”, a)) work this way?
这是我的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语句使控制跳过去的声明int x = 10;
,但进入声明x
的范围。 结果,当调用printf
时, x
未初始化。 这会导致未定义的行为,并且很可能是垃圾输出(我刚刚得到-1217572876^H12
)。 如果x
恰好为0
,我想你会得到0^H2
,这看起来像2
。
无论你想做什么,请找到一个更好的方法来做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.