目录
1.cin&cout
-
cin
对应输入流,用于获得输入/取数据;cout
对应输出流,用于输出数据 -
cin
对应于>>
,要从中取,数据的流向是流->变量
。对应的>>
叫做输入运算符。 -
cout
对应于<<
,要向其中输入,数据的流向是流<-变量
。对应的<<
叫做输出运算符。考虑是>>还是<<时,将流作为左边的,固定的,被输入/输出的对象
-
cin,cout
是iostream
头文件中定义的对象,该文件中还定义了cerr,clog
共四个ostream对象 -
使用istream(cin)对象作为条件时,
2.两种注释方式
//注释方法1,‘//’。用于单行注释
/*
注释方法2, 用于多行注释
*/
特别注意,两种注释方法不可以均不可以嵌套
3.读取不定量的数据
将std::cin >> val
作为循环条件,可以实现不定次数的输入
#include <iostream>
int main(){
int val = 0, sum = 0;
while (std::cin >> val){
sum += val;
}
std::cout << sum << std::endl;
return 0;
}
- 当后续输入的值类型与第一次输入值的类型一致时,
std::cin >> val
的值为1,会继续循环。 - 当后续输入的值类型与第一次输入值的类型一致时,
std::cin >> val
的值为0,会结束循环。
for (cin >> n; n != 0; cin>>n){}
上面的for语句也可以实现不定次数的输入,当输入0时停止。
4.常量
-
const
关键字定义的常量格式:
const valType valName value
-
#define
定义的常量格式:
#define valType value
这种方法的常量会通过值的类型来自动确定它的类型,属于隐式
-
bool类型的值与符号常量
bool类型的值,即
True
/False
可以看作cpp预定义的两个整形常量,其值分别为1、0。
5.浮点数的等于与不等
-
应该避免对浮点数进行
==
/!=
的运算,如下例。double x = 3.0, y = 4.0; bool a = (y-x*(y/x)*y == 0.0); cout << a << endl; ##一些编译器中,a的值可能为0,即false。说明浮点数相减的值不为零。
-
对于浮点数的比较,应当采用
绝对值只差很小
来判断两个浮点数是否相等。double x = 3.0, y = 4.0; if (abs(x-y) < 1e-7) cout << "x == y" << endl; else cout << "x != y" << endl;
6.位运算
-
取反
~
指将0变为1,将1变为0
-
与
&
1&1=1,其余为0
-
或
|
0|0=0,其余为1
-
异或
^
相异为1,其余为0。异或的一个性质:
( x ^ a ) ^ a = x
-
左移操作
<<
- 左移规则:将符号左边的数转为二进制后,将该数整体左移,移动的位数为符号右边的数。
- 移动方法:将二进制数整体向左移动,高位舍弃,低位补齐0
- 有时左移1位相当于
*2
-
右移操作
>>
- 右移规则:将符号左边的数转为二进制后,将该数整体右移,移动的位数为符号左边的数。
- 移动方法:将二进制数整体向右移动,舍弃低位,而对于高位:
- 对于
有符号的数
:高位补齐原最高位(符号位) - 对于
无符号的数
和有符号的非负数
:高位补0
- 对于
7.表达式
graph LR 表达式 --> 常量表达式 & 左值表达式- 常量表达式:在编译时能够确定其值的表达式
- 左值表达式:指能出现在赋值操作符
=
左边的表达式。这种表达式值的结果存放在固定的、可读取的内存中,而非临时的存储空间中。如:++x
是一个左值表达式,该式子的值存在了x中x++
不是一个左值表达式,该式子的值为x+1
,遇上一个例子不一样的是这个式子的值没有被存在变量x
中,而是作为一个临时常量存在了临时存储空间中
- 用大括号
{}
括起来的表达式被视作一整个表达式
8.空语句
cpp中的空语句指的是:只包含语句结束的;
,而不包含任何表达式的语句。
9.switch语句
switch (exp){
case expVal1: .......; break;
case expVal2: .......; break;
default: ........;
}
- 要检测的表达式/有值的变量放在括号中
case
后跟要检测变量的值,且将要执行的语句放在冒号后case
中可以放多条语句,用;
隔开,一般在语句末加break
10.循环语句
while语句
while (exp0) {exp1;exp2;...}
while语句的执行顺序如下图所示:
graph LR a(循环计算表达式0的值) --> |值为1|执行大括号内语句/while后的第一条语句 a(循环计算表达式0的值) --> |值为0|结束循环/继续向下执行while后的第二条语句do-while语句
do {exp1,exp2,.....} while (exp0);
do-while循环的执行流程如下所示:
graph TD a(exp1,exp2,....) --> b(判断exp0的值) b --> |exp0的值为0|c(结束do-while) b --> |exp0的值为1|afor语句
for (expA; expB; expC) {exp1,exp2,.....}
for循环的执行流程如下图所示:
graph LR A(expA) -->B(expB) B(expB) -->|expB值为1|x(exp1,exp2,....) x(exp1,exp2,....) --> C(expC) C(expC) -->B(expB) B ---->|expB值为0|z(结束for循环)expA|expB|expC
:三个表达式可以均为空语句
,但必须含有两个;
expA
:用作赋值表达式,for开始时会无条件执行expB
:用于判断,值为1时循环执行循环体-expC
;值为0时结束for语句expC
:用于迭代,即对迭代变量进行改变,为下次的循环做准备
11.无条件转移语句
无条件转移语句包括:goto
,break
,continue
和return
goto
labelName: doSth.....;
......
goto labelName;
goto用于转至标签处执行,标签是指用labelName:
这种格式标识的内容。
特别注意:
- goto在跳转时,不可以越过变量定义。即是说若想跨过的语句中含有变量的定义,则不能够使用goto语句。
- goto在跳转时,不可以跳出/跳入函数体。
- goto语句常用于跳出多重循环,因为
break
语句只能够跳出一重循环。
break
break的作用
:跳出当前break
所在的循环
continue
continue
只能够用在循环语句中。具体来说,只能结合while
,do-while
,for
这三种循环语句来使用。
- 用于
while
时,continue
将会跳过其后的语句,转至while的条件判断处 - 用于
do-while
时,continue
会跳至位于末尾的条件判断处 - 用于
for
时,continue
会跳至expC
处,即循环末段迭代处,然后再送至expB
条件判断处