在C ++中表达式'ab'==“ab”是否为真

时间:2012-11-28 20:53:10

标签: c++ types normalization

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

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

我不得不考虑编译器说的是什么,而是说正式的语言描述......

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

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

底线,比较结果不会反映字母选择是否相同。

答案 3 :(得分:0)

标准对于将积分类型与指针进行比较完全无话可说。它所说的全部如下(第5.9节):

  

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

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

答案 4 :(得分:0)

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