我的问题听起来可能很愚蠢,但我必须在准备学士考试时回答它。
那么,您如何看待 C++ 中这样的表达式 'ab' == "ab"?这不是真的还是根本不合法和编译错误?我用谷歌搜索了一下,知道'ab'是int类型,而“ab”当然不是......
我必须考虑的不是编译器所说的,而是语言的正式描述。
我的问题听起来可能很愚蠢,但我必须在准备学士考试时回答它。
那么,您如何看待 C++ 中这样的表达式 'ab' == "ab"?这不是真的还是根本不合法和编译错误?我用谷歌搜索了一下,知道'ab'是int类型,而“ab”当然不是......
我必须考虑的不是编译器所说的,而是语言的正式描述。
它肯定会生成一个警告,但默认情况下gcc
会编译它。它通常应该是错误的。
话虽如此,理论上应该是可能的,当然取决于您运行它的平台,"ab"
在内存位置具有编译时常量,其地址的数值等于'ab'的数值,表达式为真的情况(尽管比较当然没有意义)。
在 C 和 C++ 中的表达式'ab' == "ab"
都是无效的。它没有任何意义。两种语言都不允许将任意整数值与指针值进行比较。因此,它是否“真实”的问题甚至不会出现。为了将其转换为可编译的表达式,您必须将操作数显式转换为可比较的类型。
这里唯一的漏洞是多字符字符常量的值是实现定义的。如果在某些实现中 的值'ab'
恰好为零,则它可以用作空指针常量。在这种情况下'ab' == "ab"
,等于0 == "ab"
和NULL == "ab"
。这保证是假的。
它会给你一个警告,但它会建立。它将多字节整数“ab”与字符串文字“ab”的地址进行比较。
最重要的是,比较的结果不会反映字母是否相同的选择。
让我们考虑一下简单 C 中的部分,'c' 是一个简单的字符,如果你想操作字符串,你将不得不使用字符数组,因此'ca' 不应该按照你期望的方式工作,并且在 c++ 中这东西仍然有效。如果要使用字符串,则必须使用不是原始类型的 String 类。它所做的只是一个具有方法和类型定义的类,因此您可以更轻松地处理数组字符。结果,即使是 C 样式字符串和字符数组也是不同的东西,结果 'ab' == "ab" 不会给出有效的布尔响应。这就像尝试将 int 与字符串进行比较。所以,这个comaprison 很可能会抛出一个错误。
标准对于将整数类型与指针进行比较完全没有什么可说的。它所说的只是以下内容(在第 5.9 节中):
操作数应具有算术、枚举或指针类型,或类型 std::nullptr_t...
然后详细描述了比较两个指针的含义,并提到了比较两个整数。所以我对缺乏规范的解释是“无论编译器作者决定什么”,这要么是错误,要么是警告。