繁体   English   中英

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

[英]Why doesn't the compiler complain about adding char to char*?

为什么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+'

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

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

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

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

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

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

对于p + 'H' ,执行指针运算。 'H'被视为一个值为72的整数,然后p + 'H'将尝试返回指向数组"Hello"的第73个元素的指针,它越过边界并通向UB ,这意味着什么是可能的; 编译器不需要为它发出诊断。

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

我想你想做字符串连接,然后你应该使用std::string而不是像std::string p ="Hello";这样的指针std::string p ="Hello"; ,或使用字符串文字 (来自C ++ 14),例如std::string q = p + "World"s; ,两者都会为你执行字符串连接。

在这个声明中

std::string q = p + "World";

字符串文字"World"被转换为指向其第一个字符的指针,其类型为const char *

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

在这个声明中

std::string q = p + 'H';

有一个有效的操作,添加一个整数值'H' (由于对指针的整数提升,它被隐式转换为int类型。在用作初始化器的表达式中,使用了所谓的指针算法。编译器不检查结果指针是否指向超出字符串文字。因此不会发出诊断。

因为添加char litteral'H'就像向char添加任何其他有效char值,而添加“Hello”意味着添加指向字符串的指针,该字符串显然是不兼容的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM