这个价值是多少?

时间:2018-06-15 04:08:05

标签: c

printf("%d", "10+10");
然后我得到" 17661648"和类似的事情

printf("%d", "Hello");

这个值是多少? "1,0,+,1,0" "H,e,l,l,o"之和作为十进制数字的ASCII码?还是只是一个垃圾值?

2 个答案:

答案 0 :(得分:9)

根据C11标准n1570(参见其§7.21.6.1),您已获得undefined behavior(UB),其中也记录了hereprintf(3) 。因此,非常 scared,因为任意不好的事情都可能发生。所以要养成阅读你正在使用的每个功能的文档的习惯。

如果您要求编译器反汇编生成的程序形式(例如,如果use GCC,则在{/ 1}}编译,在Linux / x86-64上),您将发现该地址字符串文字gcc -S -O -fverbose-asm被传递(在64位上),然后被截断(在"10+10"内,因为printf)到%d。因此17661648可能对应于该地址的最低32位。

详细信息当然是特定于实现的(并且由于ASLR而可能因一次运行而不同,取决于编译器和ABI以及目标系统)。要真正理解并解释行为需要深入了解许多细节(您的特定计算机,您的特定compileroptimization标志,您的特定operating system,编译器生成汇编程序和机器代码,特别是C standard library等等......而且你不想这样做(因为它可能需要数年时间)。

您应该花几个小时阅读更多about UB。理解用C语言编程是一个必不可少的概念,你应该避免使用它。

任何好的编译器都会警告你,然后你应该改进你的代码以获得没有警告。如果使用GCC,请务必使用int进行编译以获取所有警告和调试信息。然后use the gdb debugger了解您的程序在您的系统上的实际行为。在所有情况下,请确保配置C编译器以启用所有警告和调试信息,并学习使用调试器。阅读How To Debug Small Programs

答案 1 :(得分:-1)

这样的事情应该有效:

printf("Hello");
total = 20;
printf("10+10 = %d", total);