对K& R c类型转换的解释感到困惑

时间:2014-08-11 01:53:33

标签: c

这本书在第45页上说明了以下内容

  
    

由于函数调用的参数是表达式,因此在将参数传递给函数时也会发生类型转换。在没有函数原型的情况下,char和short变为int,float变为double。这就是为什么我们声明函数参数为int和double,即使用char和float调用函数。

  

我不明白最后一句话在说什么。有人能引导我朝着正确的方向前进吗?

2 个答案:

答案 0 :(得分:3)

我们可以看到这里发生的事情。根据{{​​3}},这是printf()

的声明
int printf(const char * format, ...);

...表示此函数可以使用未指定数量的未指定类型的参数,并且因为未指定,所有intdouble的数值类型标准化{1}}除第一个之外的参数,已指定。

示例:

printf()

传递给char x = 10; short y = 100; int z = 1000; printf("Values of char is %d, short is %d, and int is %d", x, y, z); 时,所有这些整数类型都会自动重新标记为int。我们可以看到printf()适用于所有人。

请注意,不会转换大于%ddouble的类型,例如intlong intlong double等。这些类型为64位

答案 1 :(得分:0)

当您在C中使用原型作为函数时(ansi C,因为原始的K& R规范没有以这种方式定义参数),您将形式参数声明为具有类型。当您在实际表达式中匹配它时,可能会发生两件事:

  1. 形式参数和实际表达式是相同的类型。在这种情况下,每件事情都很好,表达式值用于在调用函数之前初始化参数。
  2. 形式参数和实际表达式不是同一类型。在这种情况下,编译器会尝试从实际表达式的类型到形式参数类型进行自动类型转换。
  3. 如果没有找到原型,你提出的规则就超出了规定,所以chars和short被提升为int值,浮动类型值被提升为double。

    引用段落中的最后一个短语告诉您,在某些示例(未显示)中,类型被用于形式参数,以确保实际表达式转换为形式参数的类型。