鉴于以下情况:
char const a = (i == 0) ? 0 : copy[i - 1][j];
和
char const a = (i == 0) ? '\0' : copy[i - 1][j];
为什么第一个示例产生以下内容:warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
,而第二个示例不产生。
FWIW,copy
是char**
。
此行为不仅限于char
,其他整数大小也是如此,因此看来这是一个促销问题。
答案 0 :(得分:3)
当?:
的一个结果参数为0
(int
)时,另一个结果参数将被提升为相同的类型 - C ++要求两个可能的结果具有相同的类型。处理完促销后,编译器会丢弃有关原始类型的信息,因此在发出警告时,编译器不再知道它的警告始终是char
。它没有抱怨第二个参数被降级为char
,因为它知道文字0
是有效的char
值。
答案 1 :(得分:1)
区别在于'\ 0'的类型是char,而类型0是int。
当第二和第三表达式具有不同的算术类型时,三元运算符的结果类型是通过使用与算术表达式中的类型相同的规则提升为公共算术类型来获得的。当其中一个表达式的类型为“int”而另一个表达式的类型为“char”时,结果的类型为“int”。编译器抱怨正在为char变量分配“int”值。
更智能的编译器可能会跟踪结果的可能值范围(在这种情况下与“char”的可能值范围相同),并推断实际上不存在转换的可能性从“int”到“char”将产生价值变化。