在我的 C 程序中,有一行我使用了“==”运算符,并且两个操作数被强制转换为 char,如下所示:
char top_level_domain[sizeof(char) * 128];
...
if((char)top_level_domain[i] == ':'
|| (char)top_level_domain[i] == '/')
这是推荐的/安全的吗?如果不是,我应该如何检查数组中某个元素的内容?
编辑:添加声明并删除字 rune 字的转换
最佳答案
一般来说,尽可能避免强制转换是更安全和有效的,因为它允许编译器执行类型检查。例如,发现错误:
// Let's pretend you forgot or mixed up the type here...
char **top_level_domain;
// ...
if ((char) top_level_domain[i] == (char) ':')
...
或者也许……
char top_level_domain[sizeof(char) * 128];
...
// Whoops! forgot to type [i]
if((char)top_level_domain[i] == ':'
|| (char)top_level_domain == '/')
糟糕!你忘了取消引用指针,你得到了垃圾。编译器会给您一条诊断消息,但由于您使用了强制转换,因此诊断消息消失了。
注意:这实际上会导致一些编译器出现诊断消息,因为 char
比 char *
窄,但是如果我们使用 size_t
而不是 char
则不会缩小,但仍然会出错。
为什么要使用转换?
在很多情况下,C 的“整数提升”和“通常的算术转换”会导致意外行为。例如,
size_t align_to_16_bytes(size_t x)
{
// return x & ~15u; // WRONG
return x & ~(size_t) 15u; // RIGHT
}
但是,一般来说,只有当您使用比 int
宽的类型,或者当您混合 至少 宽的有符号和无符号类型时,它才会导致问题int
.
较新的语言(例如 Java 和 C#)通过只允许扩大隐式转换在很大程度上避免了这个问题。
关于使用 '==' 运算符进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18422586/