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发布了整个声明,关闭了警告,谢谢