为什么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+'
有人可以帮助我理解,为什么第一个代码没有抛出任何错误陈述?
答案 0 :(得分:6)
'H'
是一个字符,是一个整数类型。因此p + 'H'
与&p['H']
相同(您基于'H'
的数值进行索引)。第一个片段具有未定义的行为,因为'H'
的数值可能远大于6,但编译器可以自由地不抱怨未定义的行为。
另一方面,"World"
不是整数类型,也不可转换为一类。因此无法执行添加,请指出空白。
答案 1 :(得分:2)
'H'
是单个字符,其类型为char
。 char
可以隐式转换为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;意味着添加一个指向字符串的指针,这显然是一种不兼容的类型。