18.2.3:默认类型升级和转换

[本节对应K&R第2.7节的前半部分]

在许多情况下,表达式中包含不同的类型。对于大多数编程,你不必完全记住这些规则,但最好对它们的工作原理有一个大致的了解,这样您就不会对任何默认转换感到惊讶,这样你就会知道使用显式转换(如前一节所述)在C无法执行的少数情况下所需的自动转换。

默认的转换规则有两个目的。一个纯粹是编译器的自私:它不想知道如何生成要添加的代码,例如,将浮点数转换为整数。编译器更希望所有操作都在两个相同类型的值:两个整数、两个浮点数等。(事实上,很少有处理器有添加浮点数转换为整数;大多数都有两个整数相加的指令浮点数字。)默认转换的另一个目的是程序员的便利性:计算机和编译器愚蠢的是,我们程序员必须极其痛苦地指定所有内容细节“”可能太过分了,这样做是合理的定义语言,以便执行某些转换隐式和自动由编译器执行,当这样做是明确和安全的。

那么,规则(你也可以在K&R2的第44页找到,或更新的ANSI/ISO C标准第6.2.1节)大致如下:

  1. 首先,在大多数情况下,类型的值烧焦短整型已转换为整数就在球棒上。
  2. 如果一个操作涉及两个操作数,其中一个是长双人间另一个被转换为长双人间.
  3. 如果一个操作涉及两个操作数,其中一个是双重的另一个被转换为双重的.
  4. 如果一个操作涉及两个操作数,其中一个是浮动另一个被转换为浮动.
  5. 如果一个操作涉及两个操作数,其中一个是长整型另一个被转换为长整型.
  6. 如果一个操作同时涉及有符号整数和无符号整数,情况有点复杂。如果无符号操作数较小(也许我们正在无符号整型长整型),这样,较大的带符号类型可以表示较小的无符号类型,然后将无符号值转换为较大的有符号类型,并且结果具有较大的有符号类型。否则(也就是说,如果签名类型可以代表所有无符号类型的值),两个值都转换为普通人未签名的类型,结果是无符号类型。
  7. 最后,当使用赋值运算符,如果(a) 值和变量都具有算术类型(即整数或浮点),或(b) 值和变量都是指针,其中一个是类型空隙*.
(这是这些规则的准确表述。如果您需要完美地理解复杂的类型转换情况,你可能需要查阅更明确的参考资料。特别地,前五名这些规则通常被描述为按顺序应用,按顺序为2、3、4、1、5。规则6特别复杂,虽然这是为了防止意外,它仍然设法引入了一些。)


按顺序阅读:上一个 下一个 向上的 顶部

本页依据萨米特//版权1996-1999//邮件反馈