文章目录
运算符
算术和位运算符在两个操作数类型不同时也可以使用。我们可以编写表达式 y = x + z,其中 x 是 uint8 类型,而 z 是 uint32 类型。在这种情况下,会使用以下机制来确定运算的执行类型(这对是否发生溢出非常关键)以及运算结果的类型:
-
如果右操作数的类型可以隐式转换为左操作数的类型,则采用左操作数的类型。
-
如果左操作数的类型可以隐式转换为右操作数的类型,则采用右操作数的类型。
-
否则,操作不被允许。
如果其中一个操作数是字面量数字,它首先会被转换为其“移动类型”,即足以容纳该值的最小类型(同位宽的无符号类型被认为比有符号类型更小)。如果两个操作数都是字面量数字,则运算将使用实际所需的无限精度进行计算,以确保在结果用于非字面量类型时不会丢失精度。
运算符的结果类型与实际执行运算的类型一致,而比较运算符的结果类型始终是 bool。
运算符 **(指数运算)、<< 和 >> 会使用左操作数的类型进行运算并返回结果。
三元运算符
三元运算符用于类似 <表达式> ? <真表达式> : <假表达式> 的表达式。根据主表达式的计算结果,仅执行 <真表达式> 或 <假表达式> 中的一个。如果 <表达式> 计算结果为真,则计算 <真表达式>;否则计算 <假表达式>。
三元运算符的结果类型不一定与其操作数类型一致,即使所有操作数都是有理数字面量。结果类型是根据两个备选表达式的类型共同确定的,并在需要时首先转换为它们的“移动类型”。
因此,表达式 255 + (tru