2 C++编程入门、输入输出和运算符
1 基础概念
注释
程序运行时,注释会被编译器忽略,不会生成任何机器语言目标代码。
- 单行注释(single-line comment):以双斜线
//
开头,只对此行有效。 - 多行注释:可包括若干行,注释的内容用一对符号
/*
和*/
括起来。
Tips:每个程序的开始都应该有一个注释用以描述这个程序的目的。
#include预处理指令
#include<iostream>
以“#”开头的行在程序被编译之前由预处理器来处理。这一行通知预处理器将输入/输出流头文件<iostream>
的内容包含到程序中。任何程序,只要使用C++的流输入/输出来将数据输出到屏幕或者从键盘键入数据,都必须包含这个头文件。这个头文件包含了编译器在编译程序时要用到的信息。
空行和空白间隔符
为易于阅读,程序员常使用空行、空格符和制表符(Tab),这些符号统称为空白间隔符。编译器通常会忽略空白间隔符。
main()函数
int main()
每个C++程序有且仅有一个main函数。C++程序从main函数开始执行,即使main不是定义在程序里的第一个函数。main左边的==关键字(keyword)==表明main返回一个整数值。
一条输出语句
std::cout<<"Welcome to C++!\n";
这条输出语句命令计算机执行一个操作,即输出包含在两个双引号之间的一串字符。把两个双引号和它们之间的字符一起称为串(string)、字符串(character string)或者串文字(string literal)。编译器不会忽略串中的空白间隔符。
大多数C++语句以一个分号(也成为语句终止符)结尾(预处理指令不是)。一般C++的输入和输出用字符流实现。当执行以上语句时,字符流"Welcome to C++!\n"被发送到标准输出流对象std::cout,它通常“连接”到屏幕。
Tips:
遗漏C++语句末尾的分号是一个语法错误(syntax error),因为编译器是在编译阶段中发现语法错误的,所以语法错误也称为编译器错误(compiler errors)、编译时错误(compile-time errors)或编译错误(compilation errors)。只有改正后才能运行这个程序。
std命名空间
但是用预处理指令#include<iostream>
包含到程序中的名字时,cout前的std::
是必需的。
std::cout
指出使用了“名字空间”std中的一个名字,即cout。cin也属于名字空间std。
流插入运算符和转义序列
在输出语句中,双尖括号<<
运算符称为流插入运算符(stream insertion operator)。当程序运行时,运算符右边的值(右操作数)被插入到输入流中。这个运算符指向数据流动的方向。
反斜线符号(\)称为转义字符(escape character),它表明一个特殊字符会被输出。常用的一些转义字符如下:
转义 | 序列 |
---|---|
\n | 换行符 |
\t | 水平制表符 |
\r | 回车符 |
\a | 响铃符,系统发出响铃声 |
\ | 反斜线符号 |
’ | 单引号 |
‘’ | 双引号 |
return语句
return 0;
这是我们用来退出函数的几种方法之一。如上,在main的末尾使用return语句时,0表示这个程序成功地终止了。根据C++标准,如果程序执行到main末尾但没遇到return语句,就会认为程序成功地终止了(所以常省略)。
关于注释的说明
当编写新的程序或者修改已有程序使得代码发生改变时,要及时更新注释。
变量声明
int sum = 0;
这是声明语句(declaration)。标识符sum是变量名。这个声明指定变量sum是int类型的数据,这意味着这些变量可以存储整数值。同时该声明还将这个变量初始化位0。
变量代表计算机内存中的一个特定区域,可以存储程序使用的一个值。
Tips:
尽管显式地初始化每个变量不总是必要的,但这样做可以帮助避免很多问题。
同类型的若干个变量可以在一个变量中声明,例如:
int num1 = 0,num2 = 1,num3 = 2;
int num1,num2,num3;
标识符(identifier)
变量名是除了关键字之外的合法标识符。标识符是不以数字开头的由字母、数字、下划线(_)组成的一个字符序列。C++是区分大小写的,即ai和AI是不同的标识符。
Tips:
- C++允许任意长度的标识符,但大家都C++实现可能对标识符的长度强加了一些限制。为确保可移植性,应使用31或少于31个字符的标识符。
- 应当避免在标识符中使用缩写,以提高程序的可读性。
- 应当避免使用以下划线或双下划线开头的标识符,因为C++编译器可能使用类似的名字为其内部的某些用途提供服务。
变量声明语句的放置位置
可在程序的任意位置出现,但必须在相应的变量被程序使用前。
输入语句
std::cin>>number1;
使用(在名字空间std中的)标准输入流对象cin
和流提取运算符>>
来获取从键盘输入的值。流提取运算符同std::cin
的配合使用,目的是获取从标准输入流(通常是键盘)输入的字符。
显示结果
std::cout<<"Sum is "<<sum<<std::endl;
std::endl
是一个所谓的流操纵符(stream manipulator)。endl是“end line”的缩写,属于名字空间std。流操纵符std::endl
输出一个换行符,然后“刷新输出缓存”。
在单条语句中使用多个流插入运算符称为连接(concatenating)、链接(chaining)或串联(cascading)的流插入运算。
2 内存的概念
变量名对应着计算机内存中的特定区域。将一个值存放到一块内存区域时,它都会覆盖这个区域中原有的值,因此,存放一个新值到一块内存区域的操作是具有破坏性的。
std::cin>>number1;
std::cin>>number2;
sum = number1 + number2;
执行以上代码时,假设先后输入45,72,那么内存状况如图。
但这两块区域在内存中不一定必须是相邻的。
第3行语句执行后会将原先存放在sum的值替换掉,但number1和number2的值在求sum前后是不变的。因此,当从一个内存区域中读取一个值时,这个操作是非破坏性的。
3 算术运算
算术运算符的优先级
运算符 | 运算 | 求值顺序 |
---|---|---|
() | 圆括号 | 1 最先求值。若为嵌套,则先求最内层圆括号内的表达式。若有多对圆括号不是嵌套的如(a+b)*(c-d) ,C++标准并没指定这些被括起来的子表达式的计算顺序 |
* | 乘法 | 2 其次求值。若多个同时出现,从左到右顺序求值。 |
/ | 除法 | 2 |
% | 求模 | 2 |
+ | 加法 | 3 最后求值。若多个同时出现,从左到右顺序求值。 |
- | 减法 | 3 |
4 相等运算符和关系运算符
相等运算符和关系运算符的优先级
所有的关系运算符具有相同的优先级,并且按照从左到右的顺序结合。
两个相等运算符具有相同的优先级,但优先级比关系运算符低,也按从左到右顺序结合。
关系运算符 | > | 大于 |
< | 小于 | |
>= | 大于等于 | |
<= | 小于等于 | |
相等运算符 | == | 等于 |
!= | 不等于 |
TIPS:
- 颠倒运算符
!=
、>=
、<=
的符号对中两个符号的顺序,通常会产生语法错误。但某些情况下把!=
写成=!
不会产生语法错误,但几乎可以肯定是一个逻辑错误(logic error),在运行时会产生影响。- 混淆相等运算符
==
和赋值运算符=
会产生逻辑错误。
using声明
using namespace std;
这个命令可以使程序包含任何标准的C++头文件(如<iostream>
)中的所有名字。
5 运算符的优先级
运算符 | 结合律 |
---|---|
() | 从左到右 |
* / % | 从左到右 |
+ - | 从左到右 |
<< >> | 从左到右 |
< <= > >= | 从左到右 |
== != | 从左到右 |
= | 从右到左 |