副作用和顺序点
- 副作用:指的是在计算表达式是对某些东西(如变量的值)进行了修改
- 顺序点(顺序):程序执行过程的一个点,在这里,进入下一步之前将确保对所有的副作用都进行了评估;顺序点有:分号、逗号、冒号、逻辑OR(||)运算符、逻辑AND(&&)运算符、;
任何完整的表达式末尾都有一个顺序点
; - C++中不在使用“顺序点”,此术语用于描述多线程执行,改用“顺序”来进行描述了;
递增递减运算符、组合赋值运算符、逗号运算符
-
分为
前缀
和后缀
版本,两者对操作数的影响一样
,但作用时间不同
; -
前缀递增递减运算符表示先使用操作数的值,再对操作数进行增减
;后缀则先增减,再使用值
;前缀和后缀版本还有一些执行速度上的差异,由于C++可以对类定义这些运算符,所以前缀版本将值加1然后直接返回,而后缀版本则先复制一个副本,将值加1后返回复制的副本,因此对类而言,前缀比后缀效率高,而对于内置类型差异不大
; -
优先级:前缀 = 解除引用(从右到左) < 后缀(从左到右),*++p表示先++后*
-
+=、-=、*=、 、=、%=;
-
逗号运算符允许将多个表达式放到只能放一个表达式的地方;
初始化中的逗号只是列表分隔符
;逗号运算符优先级最低且逗号表达式值为左边的值;
复合语句(语句块)
- 用一对花括号和它的语句组成,被视为一条语句
- 复合语句中定义的变量只有在执行到其中时该变量才存在,执行完后该变量被释放;如果语句块外和语块句内存在相同命名的变量,则执行语句块内的变量时,将隐藏外部的同名变量;
关系表达式
- 关系运算符:
<、<=、>、>=、==、!=
;关系运算符优先级低于算术运算符;注意等于运算符和赋值运算符,一般等于运算符按variable == value
方式使用,如果反转为value == variable
则可以捕获写为赋值运算符的错误;
类型别名
- 使用预处理#define,预处理存在多种问题,如下
- 使用关键字typedef,通用格式**
typedef typeName aliasName;
**
#define A(x) (x*x)
#define ACDER float *;
A(a+b);//将变为a+b*a+b,应该为#define A(x) ((x)*(x))
A(++c);//将变为++c + ++c,且无法解决这个问题
ACDER p,q;//将变为float * p,q,无法解决此问题
循环
- 三种基本循环:for、while、do…while
for循环
//for循环基本形式:
for(initialization-expression; test-expression; update-expression)
body
- for循环为入口条件循环
- for循环包括1. 设置初始值;2.执行测试,看是否继续进行;3.执行循环操作;4.更新用于测试的值;
- 语句和表达式,任何表达式加上分号变为语句,但反过来不对;语句不可以赋值给变量,但是表达式可以
x = 20//表达式,表达式的值为20
value + x//表达式
value + a;//语句,但无意义
int a;//语句
for(;;);//语句
return 0;//语句
- C语言for循环中必须为3个表达式,而C++允许使用类似语句的表达式,叫做声明表达式语句,如语句int a;;这样就可以合法化声明语句了;
//C++基本格式:
for(for-init-statement condition; expression; expression)
body
while循环
//while循环基本形式:
while(test-condition)
body
- while循环为入口条件循环
do while循环
//do while循环基本形式:
do
body
while(test-expression);
- do while循环为出口条件循环
基于范围的for循环(C++11)
这种循环对数组、容器的每个元素执行相同的操作
,示例如下:
double ary[] = {1.1, 2.2, 3.3, 4.4, .5};
//读取
for(double x : ary)//其中x表示每一个元素
cout << x << endl;
//写入
for(double &x : ary)//需要定义引用变量
cin >> x;
文本输入和输出
- 检测文件尾(EOF)可以判别是否到达文件结尾;很多操作系统支持重定向,允许将文件替换键盘输入,且很多系统允许键盘模拟文件尾,win下是ctrl+z,unix下是ctrl+d,而很多PC编译环境将ctrl+z视为模拟的EOF;
- 文件输出:
首先需要包含头文件fstream,定义ofstream类对象,指明命名空间std,使用open方法打开文件,输出操作,使用close方法关闭文件
,示例如下;如果文件存在,则打开,否则新建文件;
#include <fstream>
using namesapce std;
...
ofstream outFile;
outFile.open("a.txt");
outFile << 12345 << endl;
outFile.close();
- 读取文件:
首先需要包含头文件fstream,定义ifstream类对象,指明命名空间std,使用open方法打开文件,输入操作,使用close方法关闭文件
,示例如下;要注意检测文件是否存在,使用is_open()检测;读取文件时遇到EOF,eof()
返回true、最后一次操作发生类型不匹配,fail()
返回true、出现意外问题如文件损坏或硬件故障,bad()
返回true,这些问题可以统一用good()
方法来检测,发生任何错误都将返回true;
#include <fstream>
using namesapce std;
...
ifstream inFile;
inFile.open("a.txt");
if(!inFile.is_open())
exit(EXIT_FAILURE);
inFile >> a;
inFile.getline(str, 80);
inFile.close();