C++ Prime Plus 知识点整理 - 第五章 循环和关系表达式

副作用和顺序点

  • 副作用:指的是在计算表达式是对某些东西(如变量的值)进行了修改
  • 顺序点(顺序):程序执行过程的一个点,在这里,进入下一步之前将确保对所有的副作用都进行了评估;顺序点有:分号、逗号、冒号、逻辑OR(||)运算符、逻辑AND(&&)运算符、;任何完整的表达式末尾都有一个顺序点;
  • C++中不在使用“顺序点”,此术语用于描述多线程执行,改用“顺序”来进行描述了;

递增递减运算符、组合赋值运算符、逗号运算符

  • 分为前缀后缀版本,两者对操作数的影响一样,但作用时间不同

  • 前缀递增递减运算符表示先使用操作数的值,再对操作数进行增减后缀则先增减,再使用值;前缀和后缀版本还有一些执行速度上的差异,由于C++可以对类定义这些运算符,所以前缀版本将值加1然后直接返回,而后缀版本则先复制一个副本,将值加1后返回复制的副本,因此对类而言,前缀比后缀效率高,而对于内置类型差异不大

  • 优先级:前缀 = 解除引用(从右到左) < 后缀(从左到右),*++p表示先++后*

  • +=、-=、*=、 、=、%=;

  • 逗号运算符允许将多个表达式放到只能放一个表达式的地方;初始化中的逗号只是列表分隔符;逗号运算符优先级最低且逗号表达式值为左边的值;

复合语句(语句块)

  • 用一对花括号和它的语句组成,被视为一条语句
  • 复合语句中定义的变量只有在执行到其中时该变量才存在,执行完后该变量被释放;如果语句块外和语块句内存在相同命名的变量,则执行语句块内的变量时,将隐藏外部的同名变量;

关系表达式

  • 关系运算符:<、<=、>、>=、==、!=;关系运算符优先级低于算术运算符;注意等于运算符和赋值运算符,一般等于运算符按variable == value方式使用,如果反转为value == variable则可以捕获写为赋值运算符的错误;

类型别名

  1. 使用预处理#define,预处理存在多种问题,如下
  2. 使用关键字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();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值