C 在使用三元运算符将字符指定给字符时,如何通过转换避免(潜在)错误
我有以下代码:C 在使用三元运算符将字符指定给字符时,如何通过转换避免(潜在)错误,c,type-conversion,implicit-conversion,C,Type Conversion,Implicit Conversion,我有以下代码: void foo(char* char_ptr, unsigned short len) { char c = len != 0 ? char_ptr[0] : '\0'; printf("%c", c); } 我得到以下警告: Clang Tidy:实现定义了从“int”到有符号类型“char”的转换范围 这东西在说什么?我到处都只有chars。如何避免此(潜在)错误? 这看起来像是另一个“有一些你必须知道的暗含魔力”的例子。是否有一个地方
void foo(char* char_ptr, unsigned short len) {
char c = len != 0 ? char_ptr[0] : '\0';
printf("%c", c);
}
我得到以下警告:
Clang Tidy:实现定义了从“int”到有符号类型“char”的转换范围
这东西在说什么?我到处都只有char
s。如何避免此(潜在)错误?
这看起来像是另一个“有一些你必须知道的暗含魔力”的例子。是否有一个地方可以查找c编译器隐式执行的所有魔法?解释信息,特别是在“条件运算符”部分的第(3)和(1)小节中,我们看到: (3) 执行从评估结果到 通用类型,定义如下:
(1) 如果表达式有算术运算 类型,公共类型是后面的类型 然后,查看链接的“常用算术转换”,我们看到: (4) 否则,两个操作数都是整数。两个操作数都经过了运算 整数促销(见下文);然后 这些整数升级将导致两个表达式升级为
int
类型-即使您显式强制转换第二个,如char c=len!=0 ? char_ptr[0]:(char)'\0'代码>
因此,为了使警告静音,条件表达式的结果(将是int
类型)需要转换为char
,如下所示:
charc=(char)(len!=0?char\u ptr[0]:'\0');
从
6.5.15条件运算符
…
5如果第二个和第三个操作数都具有算术类型,则结果类型将由
通常的算术转换,应用于这两个操作数,
是结果的类型
这似乎证实了cppreference.com提供的信息。Re“是否有一个地方可以让我查找c编译器隐式执行的所有魔法?”:从开始。@EricPostpischil强制转换“\0”不会关闭警告。带单引号的文字是int而不是char,这是多么奇怪啊@AdrianMole发布了整个声明,关闭了警告,谢谢