繁体   English   中英

为什么printf(“%d \ n”,printf(“%d \ b”,a))以这种方式工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM