表达式
任何值或者任何有效的值和运算符的组合都称为表达式
只要加上分号,所有表达式都可以成为一个语句(但不一定有意义)
int x = 3;
x + 1; // x + 1是表达式, x + 1;是语句
C++中的每个表达式都有值
C++把赋值表达式的值定义为等号左侧的值,例如x=y=z=3就是利用了这个定义
cout << (2 == 3) << endl; // 0,cout显示bool值时默认转成int类型
cout.setf(ios_base::boolalpha);
cout << (2 == 3) << endl; // false
++、–、 * 的注意事项
注意:在同一条语句对同一个值递加或者递减多次是不允许的
int a = 2 * b++ * (3 - ++b);
前缀方式比后缀方式效率高
同时使用递增递减运算符和解引用的时候,优先级为:后缀(同级的优先级从左到右) -> 前缀/解引用(同级的优先级从右到左)
副作用 和 顺序点
副作用:在计算表达式时对某些东西(如存储在变量里的值)进行了修改
顺序点:程序运行到顺序点,在进行下一步之前所有的副作用都评估过了。
分号都是顺序点;任何一个完整的表达式末位都是一个顺序点;逗号是顺序点
while循环里的检测条件的表达式是一个顺序点
延时等待
使用系统时钟让系统等待人反应
clock()函数,在头文件ctime中,它返回值类型是clock_t,是一个整形值
ctime里定义了CLOCKS_PER_SEC,表示每秒包含的系统时间数
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
float secs;
cout << "Enter the delay time, in seconds: " ;
cin >> secs;
clock_t delay = secs * CLOCK_PER_SEC;
cout << "starting\n";
clock_t start = clock();
while(clock() - start < delay);
cout << "end\n";
return 0;
}
类型别名
#define BYTE char // 第一种,预处理器
typedef char byte; // 第二种,typedef关键字
typedef 功能更强大
typedef 只是用来取别名的,不能用来定义新类型。
基于范围的for循环
int a[] = {2, 4, 2, 4, 0};
for (int x : a)
cout << x << endl;
for (int x : {3, 0, 3, 2, 4}) // 结合初始化列表
cout << x << endl;
// 如果想修改数组元素
double a[] = {2, 4, 2, 4, 0};
for (double &x : a)
x = 0.8 * x;
函数重载
cin.get();
cin.get(ch);
cin.get(stringName, size);
函数重载的要求是参数列表不同
文件尾条件
在循环中,哨兵字符可以作为输入结束的标志
但问题是在文本输入时,可能在某些文本中哨兵字符本身就是文本的一部分
所以用文件尾条件 EOF 来检测文件尾,EOF不表示某个字符,而是表示没有字符
很多PC的编程环境都是以 Ctrl Z 模拟文件尾的,有的是Ctrl Z+回车
检测到 EOF 后,cin 会把 eofbit 和 failbit 都设置为 1
如果 eofbit 和 failbit 中任意一个被设置为1,fail() 成员函数的返回值都变成 1,即fail()=1意味着到达了文件尾,或者输入了错误的类型。
eof()成员函数返回eofbit的值,即eof()=1意味着到达了文件尾
char ch;
cin.get(ch);
while (cin.fail() != true)
{
cout << ch;
cin.get(ch);
}
用 cin.clear() 可以把 eofbit 和 failbit 位重置
cin.get(ch) ,cin.get(),cout.put(ch),cout<<ch
因为 cin.get(ch) 的返回值类型是iostream,返回cin变量 ,它可以被转化成 bool 类,所以上式可简化为
char ch;
cin.get(ch);
while (cin.get(ch)) // 当输入为真时,循环继续
{
cout << ch;
cin.get(ch);
}
ch = cin.get() 会把输入的字符转化成int常量传给ch,cin.get()函数返回值类型的是int,只是这里隐式转换了
cout.put(ch) 会把int常量再转化成char字符输出
char ch1;
int ch2;
// 假设输入的ch1是h,ch2是i
cout << "ch1: ";
ch1 = cin.get();
cout << ch1; // h,cout会自动识别char并把输出形式抓化成字符
cout.put(ch1); // h,cout.put(ch)把int型数字抓化成字符输出
cout << "ch2: ";
ch2 = cin.get();
cout << ch2; // 105,cout识别到ch2的类型是整形
cout.put(ch2); // i,cout.put(ch)把int型数字抓化成字符输出
因此检测文件尾也可以用
char ch;
ch = cin.get();
while (ch != EOF)
{
cout << ch;
ch = cin.get();
}
使用 cin.get(ch) 还是 cin.get() :一般是cin.get(ch),因为返回值是cin,cin可以再调用cin,比如
cin.get(ch1).get(ch2); // 接受一个输入传给ch1,然后接受一个对象传给ch2
嵌套数组
int a[4][5]; // 创建一个4 * 5的二维数组,每个元素的类型都是int型
int a[2][3] =
{ // 创建并初始化二维数组
{1, 3, 10},
{5, 0, 9}
};