c++Primer学习笔记之二:c++快速入门_1

通过一个简单且有效的c++函数将我们带入到c++的世界中


直接上例子

/*
*this is a c++ program
*author: wgh
*time: 2014.08.24
*/

#include <iostream>
#include "Sales/Sales_item.h"
int main()
{
	// declare variables to hold running sum and data for the next record
	Sales_item total,trans;
	if (std::cin >> total){
		while (std::cin>>trans)
			if (total.same_isbn(trans))
				total = total + trans;
			else {
				std::cout<<total<<std::endl;
				total = trans;
			}
		//remember to print last record
		std::cout<<total<<std::endl;
	}else{
		std::cout<<"No data?!"<<std::endl;
		return -1;  //indicate failure
	}
	return 0;
}

下面一点一点的解释:

1-5行:注释

在程序变得更复杂之前,我们应该明白C++如何处理注释。注释可以帮助其他人阅读程序,通常用于概括算法、确认变量的用途或者阐明难以理解的代码段。注释并不会增加可执行程序的大小,编译器会忽略所有注释。


C++ 中有单行注释和成对注释两种类型的注释。单行注释以双斜线(//)开头,行中处于双斜线右边的内容是注释,被编译器忽略。另一种定界符,注释对(/* */),是从 C 语言继承过来的。这种注释以“/*”开头,以“*/”结尾。编译器把落入注释对“/**/”之间的内容作为注释,比如这里的1-5行


程序通常混用两种注释形式。注释对一般用于多行解释,而双斜线注释则常用于半行或单行的标记。


太多的注释混入程序代码可能会使代码难以理解,通常最好是将一个注释块放在所解释代码的上方。


代码改变时,注释应与代码保持一致。程序员即使知道系统其他形式的文档已经过期,还是会信任注释,认为它会是正确的。错误的注释比没有注释更糟,因为它会误导后来者。


注意:注释对不可嵌套,比如下面的例子

#include <iostream> 
/* 
* comment pairs /* */ cannot nest. 
* "cannot nest" is considered source code, 
* as is the rest of the program 
*/ 
int main() 
{ 
	return 0; 
} 
这是不合法的注释方法

当注释掉程序的一大部分时,似乎最简单的办法就是在要临时忽略的区域前后放一个注释对。问题是如果那段代码已经有了注释对,那么新插入的注释对将提前终止。临时忽略一段代码更好的方法,是用编辑器在要忽略的每一行代码前面插入单行注释。这样,你就无需担心要注释的代码是否已包含注释对。


9行:下面我们先看下第9行,前面两行待会解释


每个 C++ 程序都包含一个或多个函数,而且必须有一个命名为 main。函数由执行函数功能的语句序列组成。操作系统通过调用 main 函数来执行程序,main 函数则执行组成自己的语句并返回一个值给操作系统。


操作系统通过 main 函数返回的值来确定程序是否成功执行完毕。返回 0值表明程序程序成功执行完毕。


main 函数在很多方面都比较特别,其中最重要的是每个 C++ 程序必须含有main 函数,且 main 函数是(唯一)被操作系统显式调用的函数。


定义 main 函数和定义其他函数一样。定义函数必须指定 4 个元素:返回类型、函数名、圆括号内的形参表(可能为空)和函数体。main 函数的形参个数是有限的。本例中定义的 main 函数形参表为空。


main 函数的返回值必须是 int 型,该类型表示整数。int 类型是内置类型,即该类型是由 C++ 语言定义的。


函数体函数定义的最后部分,是以花括号开始并以花括号结束的语句块。


注意 return 语句后面的分号。在 C++ 中多数语句以分号作为结束标记。分号很容易被忽略,而漏写分号将会导致莫名其妙的编译错误信息。


当 return 带上一个值(如 0)时,这个值就是函数的返回值。返回值类型必须和函数的返回类型相同,或者可以转换成函数的返回类型。对于 main 函数,返回类型必须是 int 型,0 是 int 型的。


在大多数系统中,main 函数的返回值是一个状态指示器。返回值 0 往往表示 main 函数成功执行完毕。任何其他非零的返回值都有操作系统定义的含义。通常非零返回值表明有错误出现。每一种操作系统都有自己的方式告诉用户main 函数返回什么内容。


7行:初窥输入/输出


C++ 并没有直接定义进行输入或输出(IO)的任何语句,这种功能是由标准库提供的。IO 库提供了大量的设施。


标准库定义了 4 个 IO 对象。处理输入时使用命名为 cin(读作 see-in)的 istream 类型对象。这个对象也称为标准输入。处理输出时使用命名为 cout(读作 see-out)的 ostream 类型对象,这个对象也称为标准输出。标准库还定义了另外两个 ostream 对象,分别命名为 cerr 和 clog(分别读作“see-err”和“see-log”)。cerr 对象又叫作标准错误,通常用来输出警告和错误信息给程序的使用者。而 clog 对象用于产生程序执行的一般信息。


为了弄清楚c++中的标准输入输出过程,下面在举个简单的例子

#include <iostream>
int main()
{
<span style="white-space:pre">	</span>std::cout<<"Enter two numbers:"<<std::endl;
<span style="white-space:pre">	</span>int v1,v2;
<span style="white-space:pre">	</span>std::cin>>v1>>v2;
<span style="white-space:pre">	</span>std::cout<<"The sum of "<<v1<<" and "<<v2
<span style="white-space:pre">			</span><<" is "<<v1+v2<<std::endl;
<span style="white-space:pre">	</span>return 0;
}
程序首先在用户屏幕上显示提示语: 
Enter two numbers: 
然后程序等待用户输入。如果用户输入 
3 7 
跟着一个换行符,则程序产生下面的输出:
The sum of 3 and 7 is 10 


程序的这一行是一个预处理指示:

#include <iostream>

告诉编译器要使用 iostream 库。尖括号里的名字是一个。头文件。程序使用库工具时必须包含相关的头文件。#include 指示必须单独写成一行——头文件名和 #include 必须在同一行。通常,#include 指示应出现在任何函数的外部。而且习惯上,程序的所有 #include 指示都在文件开头部分出现。


main 函数体中第一条语句执行了一个表达式。C++ 中,一个表达式由一个或几个操作数和通常是一个操作符组成。该语句的表达式使用输出操作符(<< 操作符),在标准输出上输出提示语: 

std::cout << "Enter two numbers:" << std::endl; 
这个语句用了两次输出操作符。每个输出操作符实例都接受两个操作数:左操作数必须是 ostream 对象;右操作数是要输出的值。操作符将其右操作数写到作为其左操作数的 ostream 对象。 
C++ 中,每个表达式都会产生一个结果,通常是将操作符作用到其操作数所产生的值。当操作符是输出操作符时,结果是左操作数的值。也就是说,输出操作返回的值是输出流本身。 既然输出操作符返回的是其左操作数,那么我们就可以将输出请求链接在一起。输出提示语的那条语句等价于 
(std::cout << "Enter two numbers:") << std::endl; 
因为((std::cout << "Enter two numbers:"))返回其左操作数 std::cout,这条语句等价于 
std::cout << "Enter two numbers:"; 
std::cout << std::endl; 
endl 是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区。通过刷新缓冲区,用户可立即看到写入到流中的输出。

程序员经常在调试过程中插入输出语句,这些语句都应该刷新输出流。忘记刷新输出流可能会造成输出停留在缓冲区中,如果程序崩溃,将会导致程序错误推断崩溃位置。


使用标准库中的名字

细心的读者会注意到这个程序中使用的是 std::cout 和 std::endl,而不是 cout 和 endl。前缀 std:: 表明 cout 和 endl 是定义在命名空间 std中的。使用命名空间程序员可以避免与库中定义的名字相同而引起无意冲突。因为标准库定义的名字是定义在命名空间中,所以我们可以按自己的意图使用相同的名字。


读入流
在输出提示语后,将读入用户输入的数据。先定义两个名为 v1 和 v2 的变量来保存输入: 

int v1, v2; 
将这些变量定义为 int 类型,int 类型是一种代表整数值的内置类型。这些变量未初始化,表示没有赋给它们初始值。这些变量在首次使用时会读入一个值,因此可以没有初始值。 下一条语句读取输入: 
std::cin >> v1 >> v2; 
输入操作符(>> 操作符)行为与输出操作符相似。它接受一个 istream 对象作为其左操作数,接受一个对象作为其右操作数,它从 istream 操作数读取数据并保存到右操作数中。像输出操作符一样,输入操作符返回其左操作数作为结果。由于输入操作符返回其左操作数,我们可以将输入请求序列合并成单个语句。换句话说,这个输入操作等价: 
std::cin >> v1; 
std::cin >> v2;
输入操作的效果是从标准输入读取两个值,将第一个存放在 v1 中,第二个存放在 v2 中。 


剩下的就是要输出结果: 

std::cout << "The sum of " << v1 << " and " << v2 
<< " is " << v1 + v2 << std::endl; 
这条语句虽然比输出提示语的语句长,但概念上没什么区别。它将每个操作数输出到标准输出。有趣的是操作数并不都是同一类型的值,有些操作数是字符串字面值。例如 
"The sum of " ,其他是各种 int 值,如 v1、v2 以及对算术表达式 v1 + v2 求值的结果。iostream 库定义了接受全部内置类型的输入输出操作符版本。


关键概念:初始化

在 C++ 中,初始化是一个非常重要的概念,已初始化变量是指变量在定义时就给定一个值。未初始化变量则未给定初始值: 

int val1 = 0; // initialized 
int val2; // uninitialized 
给变量一个初始值几乎总是正确的,但不要求必须这样做。当我们确定变量在第一次使用时会赋一个新值,那就不需要创建初始值。定义变量时,应该给变量赋初始值,除非确定将变量用于其他意图之前会覆盖这个初值。如果不能保证读取变量之前重置变量,就应该初始化变量。 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值