4

在下面的代码中,我感到困惑并添加了一个 + 应该是 <<

#include <iostream>
#include "Ship.h"

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    char someLetter = aLetter(true);
    cout <<"Still good"<<endl;
    cout << "someLetter: " + someLetter << endl;
    return 0;
}

应该

cout << "someLetter: " << someLetter << endl;

输出的错误代码:

你好世界!
还是不错的
os::clear

我不明白的是为什么编译器没有捕获任何错误以及 os::clear 是什么意思?还有为什么行首没有“someLetter:”?

4

5 回答 5

8

这里,"someLetter: "是一个字符串文字,即一个const char *指针,通常指向存储所有字符串文字的内存的只读区域。

someLetter是 a char,因此"someLetter: " + someLetter执行指针运算并将 的值添加someLetter到存储在指针中的地址。最终结果是一个指针,它指向您要打印的字符串文字之外的某个位置。

在您的情况下,指针似乎最终出现在符号表中并指向ios::clear方法名称的第二个字符。这完全是任意的,指针可能最终指向另一个(可能无法访问)位置,具体取决于someLetter字符串文字存储区域的值和内容。总之,这种行为是未定义的,你不能依赖它。

于 2012-05-18T08:05:45.397 回答
3

+运营商无关cout

如此表所示,优先+级高于<<,因此有问题的代码行被解析如下:

(cout << ("someLetter: " + someLetter)) << endl;

换句话说,+应用于一个char指针和一个char。char 是一种整数数据类型,因此您实际上是在执行指针算术运算,将右侧 char 的整数值与左侧指针相加,生成一个新的 char 指针。

于 2012-05-18T08:13:30.163 回答
2

+ 在 上进行指针算术运算"someLetter: "

于 2012-05-18T08:08:11.220 回答
2

我认为 C 字符串"someLetter: "正在使用char someLetter作为索引,因此指向内存的某些部分。因此行为。

在 C++ 中,如果你做一些愚蠢的事情,你会得到奇怪的行为。该语言为您提供了很多可以吊死自己的绳索。

于 2012-05-18T08:05:36.297 回答
0

您必须记住,文字字符串只是指向某个内存区域的指针。所做的是"someLetter: " + someLetter向该指针添加一个值,然后尝试打印它。

于 2012-05-18T08:06:16.323 回答