循环和关系表达式
for (i = 1; i < 5; i++) // 控制语句
{
} // 循环体
i = 1 // 循环初始化
i < 5 // 循环检测,c++将其强制转换为bool类型
i++ 循环更新
语法规范: for和括号之间有一个空格
表达式:所有表达式都是有值的。a=1是赋值表达式。
表达式+; = 语句,反过来不成立。
bool值得输出:cout << ture;输出是1,如果输出为true和false需要加控制符。
cout.setf(ios_base::boolalpha);
c++给for循环添加了一个功能:允许使用初始化语句。
for (int i = 1; i < 6; i++)
使用const 定义数组中元素的个数。
递增运算符和递减运算符:++ --(前后缀针对同一变量,不要出现在一个表达式中)
// 避免 b = a++ + a++;这类表达式
// 原因是c++只保证在顺序点之前两个递增运算符结束,但是不保证在哪个位置执行。
前缀和后缀的区别:
- 先计算表达式,还是先修改变量。(核心要清楚表达式的概念)
- 前缀比后缀的效率更高
副作用:在计算表达式的时候对内存中的变量进行修改。
顺序点:程序执行过程当中的一个点。
递增运算符的优先级高于*解除引用(间接值运算符)
组合运算符:+=
复合语句(代码块):将多个语句当成一个语句使用
- 在复合语句中定义变量,当复合语句结束时,则变量被释放。
逗号运算符:
- 将多个表达式组合成一个表达式
- 运算顺序是从左到右
- 运算结果是最后一个表达式
- 优先级最低
关系运算符:>,<,=,>=,<=,==
注意区分=赋值运算符和==等于运算符
C风格字符串比较:strcmp(地址1,地址2);如果两个字符串相同,则返回0,如果第一个大于第二个则正数,反之,则是负数。比较的大小按系统的排列顺序决定,即按照数值编码的大小进行排列。
string字符串比较:
string a = "abs";
string b = "a32v";
a == b;
a == "hello";
// string使用了符号重载,因此可以直接使用。只要表达式中有一个string就可以使用
空字符编码为0.
for 和 while循环的区别:
- for省略判断则为true
- for可以声明变量
- forcontinue还会执行更新语句。
写循环要默念的事情:
- 初始化
- 更新判断的变量
- 设置测试条件
让程序停一下:ctime
#include<ctime> // 头文件,包含
clock_t 是类型 // 是一个类型别名
CLOCKS_PER_SEC // 由于其使用的是系统时间,而不是真实的时间
clock() // 当前的系统时间
类型别名:一个类型的另外一种表示方法。
// 第一种利用预处理编译指令
// 其使用就是讲char原封不动的反倒BYTE处
#define BYTE char;
#define BYTE char*;
BYTE ps,pa; // 此处ps是指针,而pa是变量
// typedef 不会这样
// 第二种利用typedef,真正的类型别名
typedef char BYTE;
基于数组的for循环,c++11:
double ps[3] {1,2,3};
for (double x : ps)
// 如果要实现对数组中数据的操作
for (double &x : ps) // 引用变量
读入操作:cin.get()函数重载操作
cin.get(); // 返回输入中的下一个字符
cin.get(ch); // 返回一个cin对象
cin.get(ch,arsize);
cin操作当遇到需要bool类型的时候,将自动转换成bool类型,如果上一次读取成功,则是true.反之则是false。
读入停止的方法
- 哨兵符号
- EOF文件结尾:
- 利用键盘模拟EOF
- 重定向到文件
判断EOF的方法
cin.eof(); // 读到EOF,则为true
cin.fail(); // eof或者fail的标志位位true则返回true
// 此时将无法继续读入,需要使用cin.clear()
c++中满足c语言的要求:cout.put() cin.get()
cin.get() // 返回字符, 在进行判断时,判断返回的是否是EOF。因为EOF不是任何char,所以使用int接收。然后进行判断
cout.put() 有三种原型 当使用int输入时,无法判断使用哪一个所以需要转换。
cout.put(char)
cout.put(unsigned char)
cout.put(signed char)
赋值运算符优先级低于关系运算符优先级