表达式 'ab' == 在C++中是否"ab"正确

Is the expression 'ab' == "ab" true in C++

本文关键字:ab 正确 是否 C++ 表达式      更新时间:2023-10-16

我的问题听起来可能很愚蠢,但我必须在准备学士学位考试时回答它。

那么,您如何看待C++中的"ab"=="ab"这样的表达方式?这是不正确的还是根本不合法和编译错误?我用谷歌搜索了一下,知道"ab"是 int 类型,而"ab"当然不是......

我必须考虑的不是编译者说了什么,而是语言的正式描述。

它肯定会生成警告,但默认情况下,gcc编译它。它通常应该是假的。

话虽如此,理论上应该是可能的,当然,这取决于你运行它的平台,将编译时常量"ab"在内存位置,其地址在数值上等于"ab"的数值,在这种情况下表达式为真(尽管比较当然没有意义)。

在 C 和C++表达式中'ab' == "ab"都是无效的。它没有任何意义。这两种语言都不允许将任意整数值与指针值进行比较。出于这个原因,它是否"真实"的问题甚至不会出现。为了将其转换为可编译的表达式,您必须将操作数显式转换为可比较的类型。

这里唯一的漏洞是多字符字符常量的值是实现定义的。如果在某些实现中,'ab'的值恰好为零,则可以将其用作空指针常量。在这种情况下,'ab' == "ab"变得等效于0 == "ab"NULL == "ab"。这保证是错误的。

它会给你一个警告,但它会建立。它将要做的是将多字节整数"ab"与字符串文本"ab"的地址进行比较。

最重要的是,比较的结果不会反映字母的选择是否相同。

标准绝对

没有关于将整型与指针进行比较的说法。它所说的只是以下内容(在第 5.9 节中):

操作数应具有算术、枚举或指针类型,或 键入标准::nullptr_t...

然后,它详细介绍了比较两个

指针的含义,并提到了比较两个整数。因此,我对缺乏规范的解释是"无论编译器编写者决定什么",这要么是错误,要么是警告。

让我们考虑一下简单 C 中的部分,如果你想操作字符串,"c"是一个简单的字符,你必须使用字符数组,结果"ca"不应该按照你期望的方式工作,在 C++ 中这个东西仍然有效。如果要使用字符串,则必须使用不是原始类型的字符串类。它所做的只是一个带有方法和类型 def 的类,因此您可以更轻松地处理数组的字符。结果,即使是 C 样式字符串和字符数组也是不同的东西,因为结果 'ab' == "ab" 不会给出有效的布尔响应。这就像试图将 int 与字符串进行比较。所以,这个昏迷监狱很可能会抛出一个错误。