为什么编译器没有抱怨将char添加到char *?

时间:2017-10-31 08:13:39

标签: c++ char-pointer

为什么c ++编译器不会抱怨以下代码?

#include<iostream>
int main()
{
    const char* p ="Hello";
    std::string q = p + 'H';
    std::cout << q << std::endl;
}

以下代码正确地抛出了错误

#include<iostream>
int main()
{
    const char* p ="Hello";
    std::string q = p + "World";
    std::cout << q << std::endl;
}

编译器抛出的错误语句

test.cxx: In function 'int main()':
test.cxx:5: error: invalid operands of types 'const char*' and 'const char [6]' to binary 'operator+'

有人可以帮助我理解,为什么第一个代码没有抛出任何错误陈述?

5 个答案:

答案 0 :(得分:6)

'H'是一个字符,是一个整数类型。因此p + 'H'&p['H']相同(您基于'H'的数值进行索引)。第一个片段具有未定义的行为,因为'H'的数值可能远大于6,但编译器可以自由地不抱怨未定义的行为。

另一方面,"World"不是整数类型,也不可转换为一类。因此无法执行添加,请指出空白。

答案 1 :(得分:2)

'H'单个字符,其类型为charchar可以隐式转换为int,因此它会将此值添加到指针p(按该值推进)。

请注意,它仍然是未定义的行为,因为新指针q指向数组之外。

答案 2 :(得分:2)

两者都不执行字符串连接(如您所料)。

对于p + 'H',执行指针运算。 'H'被视为值为72的整数,然后p + 'H'将尝试返回指向数组"Hello"的第73个元素的指针,它将超出约束并导致UB,这意味着一切皆有可能;编译器不需要为它发出诊断信息。

对于p + "World",你要添加两个指针(即const char*),这根本没有意义。

我想你想要进行字符串连接,那么你应该使用std::string而不是std::string p ="Hello";之类的指针,或者使用string literals(来自C ++ 14),例如std::string q = p + "World"s;,两者都会为你执行字符串连接。

答案 3 :(得分:2)

在本声明中

"World"

字符串文字const char *将转换为指向其第一个字符的指针,其类型为std::string q = p + 'H';

因此尝试添加两个指针。此类操作未定义,编译器发出错误。

在本声明中

'H'

使用了一个有效的操作,即添加整数值int(由于对指针的整数提升,它被隐式转换为类型 { "format": // file extn ----only xls "docTitle": //file name "document" :// base 64 encoded data } 。这在用作初始值的表达式中使用了所谓的指针算法。编译器不检查结果指针是否指向超出字符串文字。因此没有发出诊断。

答案 4 :(得分:0)

因为添加一个char litteral&#39; H&#39;就像在char中添加任何其他有效的char值,而添加&#34; Hello&#34;意味着添加一个指向字符串的指针,这显然是一种不兼容的类型。