printf("%d", "10+10");
然后我得到" 17661648"和类似的事情
printf("%d", "Hello");
这个值是多少?
"1,0,+,1,0"
"H,e,l,l,o"
之和作为十进制数字的ASCII码?还是只是一个垃圾值?
答案 0 :(得分:9)
根据C11标准n1570(参见其§7.21.6.1),您已获得undefined behavior(UB),其中也记录了here或printf(3) 。因此,非常 scared,因为任意不好的事情都可能发生。所以要养成阅读你正在使用的每个功能的文档的习惯。
如果您要求编译器反汇编生成的程序形式(例如,如果use GCC,则在{/ 1}}编译,在Linux / x86-64上),您将发现该地址字符串文字gcc -S -O -fverbose-asm
被传递(在64位上),然后被截断(在"10+10"
内,因为printf
)到%d
。因此17661648可能对应于该地址的最低32位。
详细信息当然是特定于实现的(并且由于ASLR而可能因一次运行而不同,取决于编译器和ABI以及目标系统)。要真正理解并解释行为需要深入了解许多细节(您的特定计算机,您的特定compiler和optimization标志,您的特定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);