+运算符在cout中做了什么?

时间:2012-05-18 07:58:08

标签: c++ iostream

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

的地方
#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;

输出的代码不正确:

  

Hello world!
  还是不错的   OS ::明确

我不明白为什么编译器没有捕获任何错误,os :: clear意味着什么?为什么在行的开头不是“someLetter:”?

5 个答案:

答案 0 :(得分:8)

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

someLetterchar,因此"someLetter: " + someLetter执行指针算术并将someLetter的值添加到指针中存储的地址。最终结果是一个指针,指向您打算打印的字符串文字。

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

答案 1 :(得分:3)

+运算符与cout无关。

this表所示,+的优先级高于<<,因此违规行代码的解析方式如下:

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

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

答案 2 :(得分:2)

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

在C ++中,如果你做了愚蠢的事情,你会得到奇怪的行为。这种语言为你提供了充足的绳索。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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