C++ Primer Plus 第五章 循环和关系表达式

表达式

任何或者任何有效的值和运算符的组合都称为表达式

只要加上分号,所有表达式都可以成为一个语句(但不一定有意义)

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 会把 eofbitfailbit 都设置为 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}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值