使用 '==' 运算符进行转换

标签 c arrays

在我的 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 == '/')

糟糕!你忘了取消引用指针,你得到了垃圾。编译器给您一条诊断消息,但由于您使用了强制转换,因此诊断消息消失了。

注意:这实际上会导致一些编译器出现诊断消息,因为 charchar * 窄,但是如果我们使用 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/

相关文章:

c - (希望)我的刽子手游戏的最后一个循环,

JavaScript (ECMA) 语法 - 左递归问题

c++ - 如何在 C++ 中向 BYTE 数组添加填充?

java - Python 中的多维数组

php - 如何在 PHP 中编码字节数组

c - 在没有库的情况下将 JVM 嵌入 C 程序的推荐方法?

c - 如何在读取前刷新串口?

arrays - 如何动态设置 Rust 数组长度?

FFmpeg 可以用作库而不是独立程序吗?

java - 尝试理解 true/false 格式的 set 方法的数据验证