这个C程序输出垃圾

时间:2010-12-09 15:30:09

标签: c

#include<stdio.h>
int main()
{
    char a='x'; 
    printf("%c %d",a);
    return 0;
} 

输出:

  

x 134513696

什么是134513696?

4 个答案:

答案 0 :(得分:6)

垃圾。这是由于编程错误: 你只在堆栈上放了一个参数(a),但是printf从堆栈中取2个值,因为有两个百分号。

如果您打算同时拥有输出,字符及其序数值,您应该写printf("%c %d", a, a);

答案 1 :(得分:2)

如果printf()中的格式说明符数大于传递的参数数,则未定义

例如:

printf("%d %d %d", 1, 2); // UB
printf("%f %d %d"); // UB

但是如果参数的数量更多(比格式说明符更多),则只评估和忽略额外的参数。

例如:

printf("%d" ,1,2); //fine. Prints 1

答案 2 :(得分:2)

假设您与黑手党老板签订合同,以1000美元的价格购买一批货物。然后你只交了500美元,那天晚上你回家找到一只死猫在你的床上。你期待什么?! C是黑手党的老板,你和他签了合同。很高兴这只是你终端上的一个无用的号码,而不是你的电脑爆炸。

答案 3 :(得分:0)

printf使用变量参数列表。它无法检查格式字符串中的参数数量(在您的情况下为2 "%c %d")是否与va_list(您只有一个)中的参数数量相等,因此它将获取一些未定义的参数值。如果格式字符串格式正确,编译器将不会检查您。