C++ 单引号语法
C++ single quotes syntax
我正在学习 C++,刚开始阅读 Bjarne Stroustrup 的 "Programming Principles and Practice",他使用这段代码来说明一个观点:
#include "std_lib_facilities.h"
using namespace std;
int main() // C++ programs start by executing the function main
{
char c = 'x';
int i1 = c;
int i2 = 'x';
char c2 = i1;
cout << c << ' << i1 << ' << c2 << '\n';
return 0;
}
我大体上熟悉 C++ 世界中双引号和单引号之间的区别,但是有人可以解释一下 ' << i1 << ' 部分的结构和目的
谢谢
在回答您的问题之前,先了解一下它实际在做什么的一些背景知识。另请注意示例中有一个错字,字符串常量应该用双引号引起来:
cout << c << " << i1 << " << c2 << "\n";
在 C++ 中,运算符可以重载,因此它们具有不同的功能。在 cout 的情况下,<< 运算符被重载为 "Insertion Operator"。可以将其视为获取右侧的操作数,并将其插入(或发送)到左侧的运算符中。
例如,
cout << "Hello World";
这会获取字符串 "Hello World",并将其发送到 cout 进行处理。
所以初学者不明白这样的东西是什么意思:
cout << "Hello" << " World";
这是在做同样的事情,但是运算符优先级表示从左到右执行注入。为了使这项工作正常进行,cout 对象 return 将自身作为一个函数 return 值。为什么这很重要?因为上面的语句其实是两个独立的运算符求值:
(cout << "Hello") << " World";
这首先将 "Hello" 注入 cout,输出它,然后继续计算下一个注入运算符。因为 cout returns 本身,在执行 (cout << "Hello") 之后,您仍然需要评估以下内容:
cout << " World";
此表达式将“World”注入 cout 对象,然后输出“World”,最终效果是 "Hello World" 就像第一次看到的那样。
所以在你的例子中,它在做什么?
cout << c << " << i1 << " << c2 << "\n";
从左到右计算如下:
((((cout << c) << " << i1 << ") << c2) << "\n"); => Outputs value of c
((((cout ) << " << i1 << ") << c2) << "\n"); => Outputs string " << i1 << "
((( cout ) << c2) << "\n"); => Outputs value of c2
(( cout ) << "\n"); => Outputs newline character
( cout ); => No more output
表达式完成,return将 cout 对象作为表达式值。
假设c='x'和c2='x',该表达式最终输出为单行输出如下字符串:
x << i1 << x
对于初学者来说,那些插入运算符<<看起来有点奇怪。这是因为你正在处理对象。在将字符串注入 cout 之前,您可以将该字符串构建为一个完整的格式化对象,虽然这会使 cout 表达式看起来更简单,但我们不会在 C++ 中这样做,因为它会使您的代码更复杂且更容易出错。另请注意,cout 对象没有什么特别之处。如果你想输出到标准错误流,你可以使用 cerr 代替。如果你想输出到一个文件,你会实例化一个输出到所需文件的流对象。您示例中的其余代码将是相同的。
在 C 中,同样的事情可以使用格式字符串在程序上完成:
printf("%d << i1 << %d\n", i1, c2);
这在C++中也是允许的,因为C++是C的超集。许多C++程序员仍然使用这种输出方法,但那是因为那些程序员首先学习C,并且可能没有完全接受面向对象的本质C++
请注意,您可能还在数学表达式的上下文中看到过 << 运算符,例如:
A = A << 8;
本例中<<运算符就是按位循环运算。它与 cout 的输出无关。它会将 A 中的位向左旋转八位。
cout << c << ' << i1 << ' << c2 << '\n';
书中似乎有错别字。我在 Programming Principles and Practice Using C++ (Second Edition) Second printing 看到了。我没有在勘误表中看到它。
根据本书,预期输出是
x 120 x
但是这里发生的是 ' << i1 << '
尝试将 << i1 <<
压缩为一个多字节字符并打印出一个整数(很可能是 540818464-> 0x203C3C20 -> [=16 的 ASCII 值=]) 因为 cout
不认识宽字符。为此,您需要 wcout
。最终结果输出类似
x540818464x
以及来自编译器的一两个警告,因为虽然它是有效的 C++ 代码,但它几乎肯定不是您想要的。
该行最有可能是
cout << c << ' ' << i1 << ' ' << c2 << '\n';
这将输出预期的 x 120 x
换句话说,Linker3000,你没疯也没看错示例代码
任何人都知道我应该联系谁来记录勘误表或得到澄清,以防我脑子里有一些绝密的偷偷摸摸的事情?
我正在学习 C++,刚开始阅读 Bjarne Stroustrup 的 "Programming Principles and Practice",他使用这段代码来说明一个观点:
#include "std_lib_facilities.h"
using namespace std;
int main() // C++ programs start by executing the function main
{
char c = 'x';
int i1 = c;
int i2 = 'x';
char c2 = i1;
cout << c << ' << i1 << ' << c2 << '\n';
return 0;
}
我大体上熟悉 C++ 世界中双引号和单引号之间的区别,但是有人可以解释一下 ' << i1 << ' 部分的结构和目的
谢谢
在回答您的问题之前,先了解一下它实际在做什么的一些背景知识。另请注意示例中有一个错字,字符串常量应该用双引号引起来:
cout << c << " << i1 << " << c2 << "\n";
在 C++ 中,运算符可以重载,因此它们具有不同的功能。在 cout 的情况下,<< 运算符被重载为 "Insertion Operator"。可以将其视为获取右侧的操作数,并将其插入(或发送)到左侧的运算符中。
例如,
cout << "Hello World";
这会获取字符串 "Hello World",并将其发送到 cout 进行处理。
所以初学者不明白这样的东西是什么意思:
cout << "Hello" << " World";
这是在做同样的事情,但是运算符优先级表示从左到右执行注入。为了使这项工作正常进行,cout 对象 return 将自身作为一个函数 return 值。为什么这很重要?因为上面的语句其实是两个独立的运算符求值:
(cout << "Hello") << " World";
这首先将 "Hello" 注入 cout,输出它,然后继续计算下一个注入运算符。因为 cout returns 本身,在执行 (cout << "Hello") 之后,您仍然需要评估以下内容:
cout << " World";
此表达式将“World”注入 cout 对象,然后输出“World”,最终效果是 "Hello World" 就像第一次看到的那样。
所以在你的例子中,它在做什么?
cout << c << " << i1 << " << c2 << "\n";
从左到右计算如下:
((((cout << c) << " << i1 << ") << c2) << "\n"); => Outputs value of c
((((cout ) << " << i1 << ") << c2) << "\n"); => Outputs string " << i1 << "
((( cout ) << c2) << "\n"); => Outputs value of c2
(( cout ) << "\n"); => Outputs newline character
( cout ); => No more output
表达式完成,return将 cout 对象作为表达式值。
假设c='x'和c2='x',该表达式最终输出为单行输出如下字符串:
x << i1 << x
对于初学者来说,那些插入运算符<<看起来有点奇怪。这是因为你正在处理对象。在将字符串注入 cout 之前,您可以将该字符串构建为一个完整的格式化对象,虽然这会使 cout 表达式看起来更简单,但我们不会在 C++ 中这样做,因为它会使您的代码更复杂且更容易出错。另请注意,cout 对象没有什么特别之处。如果你想输出到标准错误流,你可以使用 cerr 代替。如果你想输出到一个文件,你会实例化一个输出到所需文件的流对象。您示例中的其余代码将是相同的。
在 C 中,同样的事情可以使用格式字符串在程序上完成:
printf("%d << i1 << %d\n", i1, c2);
这在C++中也是允许的,因为C++是C的超集。许多C++程序员仍然使用这种输出方法,但那是因为那些程序员首先学习C,并且可能没有完全接受面向对象的本质C++
请注意,您可能还在数学表达式的上下文中看到过 << 运算符,例如:
A = A << 8;
本例中<<运算符就是按位循环运算。它与 cout 的输出无关。它会将 A 中的位向左旋转八位。
cout << c << ' << i1 << ' << c2 << '\n';
书中似乎有错别字。我在 Programming Principles and Practice Using C++ (Second Edition) Second printing 看到了。我没有在勘误表中看到它。
根据本书,预期输出是
x 120 x
但是这里发生的是 ' << i1 << '
尝试将 << i1 <<
压缩为一个多字节字符并打印出一个整数(很可能是 540818464-> 0x203C3C20 -> [=16 的 ASCII 值=]) 因为 cout
不认识宽字符。为此,您需要 wcout
。最终结果输出类似
x540818464x
以及来自编译器的一两个警告,因为虽然它是有效的 C++ 代码,但它几乎肯定不是您想要的。
该行最有可能是
cout << c << ' ' << i1 << ' ' << c2 << '\n';
这将输出预期的 x 120 x
换句话说,Linker3000,你没疯也没看错示例代码
任何人都知道我应该联系谁来记录勘误表或得到澄清,以防我脑子里有一些绝密的偷偷摸摸的事情?