(原创)c++primer(第五版)--1.2 初始输入和输出

  c++语言并未定义任何的输入输出(IO)语句,取而代之,包含了一个全面的标准库(standard library)来提供IO机制。

  本书中的很多示例都使用了iostream库。iostream库包含两个基本类型 istreamostream,分别表示输入流和输出流。一个流就是一个字符序列,是从IO设备读出或写入IO设备的。术语“流”(stream)想要表达的是,随着时间的推移,字符是顺序生存或消耗的。

  标准输入输出对象  

  1. cin(发音为see-in):标准输入;istream类型的对象;

  2. cout(发音see-out):标准输出;ostream类型的对象;

  3. cerr(发音see-err):标准错误;ostream类型对象;通常用来输出警告和错误消息;

  4. clog(发硬see-log):ostream类型对象;用来输出程序运行时的一般性消息;

  系统通常奖程序所运行的窗口与这些对象关联起来。因此,当我们读取cin,数据将从程序正在运行的窗口读入,当我们向cout,cerr,和clog写入数据时,将会写到同一个窗口。

  一个使用IO库的程序

  使用IO库,扩展main程序,使之能提示用户输入两个数,然后输出他们的和:

#include <iostream>
#include <cstdlib>

int main() {
    std::cout << "Enter two numbers:" << std::endl;
    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;
    std::cout << "The sum of" << v1 << " and " << v2
                  << " is " << v1 + v2 << std::endl;
    system("pause"); // 星月用的是vs 2012,所以需要暂停输出窗口
    return 0;
}

  输出结果如下:

  

  程序的第一行

#include <iostream>

  告诉编辑器我们想要使用iostream库。尖括号中的名字指出了一个头文件。每个使用标准库设施的程序都必须包含相关的头文件。#include指令必须出现在所有函数之外。我们一般将一个程序的所有#include指令都放在源文件的开始位置。

  向流写入数据

  main函数体的第一条语句执行了一个表达式(expression)。c++中,一个表达式产生一个计算结果,它由一个或多个运算对象和(通常是)一个运算符组成。这条语句中的表达式使用了输出运算符<<)在标准输出上打印消息:

std::cout << "Enter two numbers:" << std::endl;

  <<运算符接受两个运算对象:左侧的运算对象必须是一个ostream对象,右侧的运算对象是要打印的值。输出运算符的计算结果就是其左侧运算对象。

  我们使用了两次<<运算符。因为此运算符返回其左侧的运算对象,因此第一个运算符的结果成为了第二个运算符的左侧运算对象。这样,我们就可以将输出请求连接起来。因此,我们的表达式等价于:

( std::cout << "Enter two numbers:" ) << std::endl;

  链中的每个运算符的左侧运算对象都是相同的,在本例中是 std::cout。我们也可以用两条语句生成相同的输出:

std::cout << "Enter two numbers:";
std::cout << std::endl;

  第一个输出运算符给用户打印一条消息。这个消息是一个字符串字面值常量(string literal),是用一对双引号包围的字符串。在双引号之间的文本被打印到标准输出。

  第二个运算符打印endl,这个一个被称为操纵符(manipulator)的特殊值。

  endl作用是:结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流。即,使用标准输出,只是将 要输出的内容 写到内存中,这时并没有马上写入到输出流中,而是在内存中等待,直到刷新缓冲区,才把内存中的字符流写入到输出流中。  

注意:
    程序员常常在调试时添加打印语句。这类语句应该保证“一直”刷新流。否则,如果程序崩溃,输出可能还留在缓冲区中,从而导致关于程序崩溃位置的错误推断。

  使用标准库中的名字

  细心的读者可能会注意到程序使用了std::cout 和std::endl,而不是直接的cout 和 endl。

  (小白:真的耶..为什么要std。)

  (星月:咳咳..小白,你不是回家过年了吗!!!)

  (小白:...)

  (星月:我们继续。)前缀std::指出名字 cout 和 endl 是定义在名为std的命名空间(namespace)中的。

  (小白:命名空间是做什么的??)

  很好,假设没有命名空间,我们来看个测试代码:

// 由于测试,所以不保证代码的严谨性
#include <iostream>

void abs( int a ) {
    string str = "this is test!"
}

int main() {
  int a = 3;   abs( a );  // -- 1
  return 0;}

  上面代码中,在 1 处调用abs方法。假设没有命名空间,我们知道系统有自带的abs方法,那么在 1 处我们是调用系统的方法,还是我们自己的定义的方法呢?对于这种二义性,c++才提供命名空间的概念。

  命名空间:可以帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。

  标准库定义的所有名字都在命名空间std中。

  加上命名空间后上述代码:

// 由于测试,所以不保证代码的严谨性
#include <iostream>

void abs( int a ) {
    string str = "this is test!"
}

int main() {
    int a = 3;
    abs( a );  // 使用自定义函数
   std::abs( a );  // 使用标准库的里面的函数
  return 0;
}

  通过命名空间使用标准库有一个副作用:当使用标准库中的一个名字时,必须显示说明我们想使用来自命名空间std中的名字。

  我们使用作用域运算符::)来指出我们想使用--定义在命名空间 XXX 中的名字 MMM。比如:std::cout,::指出--使用命名空间 std 中的名字 cout。

时间: 2024-10-13 10:52:29

(原创)c++primer(第五版)--1.2 初始输入和输出的相关文章

(原创)c++primer(第五版)--1.1 一个简单的c++程序

每个c++程序都包含一个或多个函数(function),其中一个必须命名为 main.    注意:操作系统通过调用main来运行c++程序,即main函数是程序执行的入口,所以每个程序都必须有一个函数命名为 main. 下面是一个非常简单的main函数,它什么也不干,只是返回给操作系统一个值: 1 int main() { 2 return 0; 3 } 一个函数的定义包括四个部分:返回类型(return type),函数名(function name),一个括号包围的形参列表(paramet

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器 多重映照容器multimap与map结构基本相同,但由于重复键值存在,所以multimap的元素插入.删除.查找都与map的方法不相同. 1.multimap对象创建.元素插入 插入元素时,需要使用insert()方法和类似pair<string,double>("Jack", 300.5)的元素结构.可以看到,重复的元素是按照插入的先后顺序排序的. #include <iostre

C++ Primer(第五版)学习笔记_5_标准模板库string(2)

C++ Primer(第五版)学习笔记_5_标准模板库string(2) 10.搜索string对象的元素或子串 采用find()方法可查找字符串中的第一个字符元素(char, 用单引号界定)或者子串(用双引号界定):如果查到,则返回下标值(从0开始计数),如果查不到,则返回一个很大的数string:npos(即:4294967295). #include <iostream> #include <stdio.h> #include <string> using nam

C++ Primer(第五版)学习笔记_3_标准模板库vector(2)

C++ Primer(第五版)学习笔记_3_标准模板库vector(2) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 6.元素的插入 insert()方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置. 要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标. #include <iostream> #include <vector> using namespa

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 标准模板库(STL)提供三种类型的组件:容器.迭代器和算法,他们都支持泛型程序设计标准. 容器主要有两类:顺序容器和关联容器.顺序容器(vector.list.deque和string等)是一系列元素的有序集合.关联容器(set.multiset.map和multimap)包含查找元素的键值. 迭代器的作用是遍历容器. STL算法库包含四类算法:排序算法.不可变序算法.变序性算法

C++ Primer(第五版)学习笔记_2_标准模板库vector(1)

C++ Primer(第五版)学习笔记_2_标准模板库vector(1) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 向量容器vector不但能像数组一样进行随机访问,还能在尾部插入元素,完全可以替代数组. 值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间. 容器vector的下标是从0开始的,如果vector容器的大小是n,则元素下标为0~n-1,这和数组的一样的.不一样的是,vector可以随时调整其大小. vector重要的方法有三个

C++ Primer(第五版)学习笔记_4_标准模板库string(1)

C++ Primer(第五版)学习笔记_4_标准模板库string(1) 1.创建string对象 创建一个空字符串,其长度为0 #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { string s; cout << s.length() << endl; return 0; } 运行结果: 0 2.给string对象赋值

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器 Set集合容器实现了红黑树(Red-BlackTree)的平衡二叉检索树的数据结构,在插入元素时,它会自动调整二叉树的排序,把该元素放到适当的位置. (1)确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值: (2)另外,还得确保根节点左子树的高度与右子树的高度相等.这样,二叉树的高度最小,从而检索速度最快. 平衡二叉检索树的检索使用中序遍历算法,检索效率高.默认情况下,将键值由小到大遍历. 对于s

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器 map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系. map映照容器的数据结构也是采用红黑树来实现的. 1.map创建.元素插入和遍历访问 #include <iostream> #include <stdio.h> #include <vector> #include <map> #include <string> using n