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
首先你要明白'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
我是 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
首先你要明白'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