5

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

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

我必须考虑的不是编译器所说的,而是语言的正式描述。

4

5 回答 5

4

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

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

于 2012-11-28T20:57:07.447 回答
4

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

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

于 2012-11-28T21:35:17.270 回答
1

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

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

于 2012-11-28T20:57:15.027 回答
0

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

于 2012-11-28T21:26:18.267 回答
0

标准对于将整数类型与指针进行比较完全没有什么可说的。它所说的只是以下内容(在第 5.9 节中):

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

然后详细描述了比较两个指针的含义,并提到了比较两个整数。所以我对缺乏规范的解释是“无论编译器作者决定什么”,这要么是错误,要么是警告。

于 2012-11-28T21:08:35.633 回答