c-如何通过转换避免(潜在的)错误时,将一个字符分配给一个字符的三元运算符



我有以下代码:

void foo(char* char_ptr, unsigned short len) {
char c = len != 0 ? char_ptr[0] : '';
printf("%c", c);
}

我收到以下警告:

Clang Tidy:缩小从"int"到有符号类型"char"的转换是实现定义的

这个东西在说什么转换?我到处都只有char。如何避免这种(潜在的(错误?这看起来像是";有一些隐含的魔法正在发生,你只需要知道";。有没有一个地方可以让我查找c编译器隐式执行的所有魔术?

解释来自此cppreference页面的信息,特别是在;条件运算符";第(3(和(1(小节,我们看到:

(3(执行从评估结果到常见类型,定义如下:

(1(如果表达式具有算术类型,常见类型是经过常规算术转换后的类型

然后,查看链接的";通常的算术转换";,我们看到:

(4(否则,两个操作数都是整数。两个操作数都经历整数促销(见下文(;然后

这些整数提升将导致两个表达式都提升为int类型,即使您显式强制转换第二个类型,如char c = len != 0 ? char_ptr[0] : (char)'';

因此,为了使警告静音,条件表达式(将为int类型(的结果需要强制转换为char,如:

char c = (char)(len != 0 ? char_ptr[0] : '');

来自本草案C11标准

6.5.15条件运算符

5如果第二个和第三个操作数都具有算术类型,则由通常的算术转换,如果它们应用于这两个操作数,是结果的类型。

这似乎证实了cppreference.com提供的信息。

相关内容

  • 没有找到相关文章

最新更新