std::cout 使用“ ”暗示 - 不理解输出

std::cout using ' ' implitations - Dont understand the output

我是 C++ 的完全新手,试图从 C 迁移到这种新语言,但使用它必须提供的新东西。感谢支持


问题很简单直接,std::cout 中的 ' ' 是做什么的?

#include "includes.h"

int main( ){

    char c1 = 'x', c2;
    int i1 = c1 , i2 = 'x';

    c2 = i1;

    std::cout << c1 <<'<< i1 <<'<< c2 <<'\n';

}

我从 Bjarne Stroustrup Book("Programming Principles and Practice using C++" 第二版)复制了这段代码,并做了细微的差别。在其中,他说输出将是 x 120 x 或 x120x(我的眼睛看不出与印刷品的区别),事实并非如此。

单引号意味着环绕 一个字符文字。喜欢:

'A' 'C' 'x' ' ' '5' etc.

单引号 ' 并不是要将字符串文字(由多个字符文字组成)括起来,所以这样做是错误的:

`Hello World`

或者您的情况:

'<< i1 <<'

所以经验法则是:当用单引号 'a' 将字符文字括起来时,当处理字符串文字时用双引号将其括起来:"Some string 123"。 如果您只是想打印出 i2 变量,请使用:

std::cout << c1 << i1 << c2 << '\n';

更新: 该规则也有例外。一些实现支持将多字符文字用单引号括起来。

A multicharacter literal has type int and implementation-defined value.

C11 规范中的 6.4.4.4/10 有更多关于该主题的信息。

看来这本书的印刷有问题,或者您抄错了。它可能应该是:

std::cout << c1 << ' ' << i1 << ' ' << c2 <<'\n';

' ' 是单个 space 字符,因此这会在 i1 中的数字周围放置 spaces。它打印:

x 120 x

DEMO

首先你要明白'a'"a"的区别。

'a' 是字符文字。它是 char 类型,在大多数系统上值为 97(字母 a 的 ASCII/Latin-1/Unicode 编码)。

"a" 是一个字符串文字。它是 const char[2] 类型,引用一个包含 2 char 个值 'a''[=21=]' 的数组。在大多数(但不是全部)上下文中,对 "a" 的引用将隐式转换为指向字符串第一个字符的指针。

两者都

cout << 'a';

cout << "a";

碰巧产生相同的输出,但出于不同的原因。第一个打印单个字符值。第二个连续打印字符串的所有字符(终止 '[=21=]' 除外)——恰好是单个字符 'a'.

字符串文字可以是任意长的,例如"abcdefg"。字符文字几乎总是只包含一个字符。 (您可以使用 多字符文字 ,例如 'ab',但它们的值是实现定义的,很少有用。)

(在你没有问的C中,'a'int类型,"a"char[2]类型(没有const)).

因此,在您的情况下,键入如下代码:'<< i1 <<' 是字符文字。 char