5.循环和关系表达式
5.1 C++语法将整个for循环看作一条语句.
5.2 循环只执行一次初始化.
5.3 执行测试条件: 可以是任意表达式.
C++将把运算结果转换为bool类型: 非零转换为true, 0转换为false. 这种变化不会导致不兼容问题--因为C++会在需要整数值的地方将true/flase 分别转换为1/0; 在需要 bool值的地方 将0 转换为false,非零转换为true.
5.4 for循环是入口条件循环--进入每轮循环前都会计算测试表达式的值.
5.5 编码习惯: for 和 '(' 之间加一空格;而函数名与括号之间不加空格. 从视觉上强化控制语句和函数调用 之间的区别.
5.6 表达式: C++表达式是值或与操作符的组合,每个C++表达式都有值.
eg: a = 3 表达式的值为 3; 因而 允许 这样: a = b =c =0; //从右向左: c = 0的值为0,所以变成: a = b = 0;......
x<y 表达式的值为: true or false. cout<<x<y; 将显示 1 or 0.
可以使用 cout.setf(ios_base::boolalpha);//旧版用:ios::boolalpha 设置一标记, cout 将显示 true or false.
表达式加上分号 ';' 都成语句, eg: a+b; 为合法语句,只是没用得到的结果.
语句去掉分号不一定为表达式, eg: int a; 为语句, 去掉分号则不是表达式.
5.7 可以在for循环初始化部分声明变量. 为局部变量,离开循环后变量将消失.
5.8 建议: 在声明数组和引用数组长度时(如:for循环)使用const值, 以避免值被修改.
5.9 省略for循环中测试表达式,将认为是 true. 如: for(;;){} 测试表达是为true 程序不会终止.
5.10 语句块 { } . 代码中可以用一对花括号 {} 将一段代码括起. 在里面声明的变量的作用范围只是其所在语句块.
5.11 逗好操作符 可以将多个表达式用 ',' 分割放在一个for循环表达式中
i = 20, j = 2 * i //逗好操作符 确保先计算第一个表达式,以后逐个计算; 而整体表达式的值为最后一个表达式的值. 还有 (17,40) 表达式的值为 40.
5.12 花絮:
** for (cin>>x; x == 0; cin>>x){} //接受输入,直到输入的是 数值: 0.
*** 上式中 '==' 若误写为 '=' 关系运算 将变为 赋值运算. 如运算符 右边的值非零,则测试表达式的值为true,循环将不会终止.
5.13 while 循环
*** delay 一例:
#include<ctime> describes clock() function, clock_t type
clock_t delay = secs * CLOCKS_PER_SEC; //defined in ctime
clock_t start = clock(); //get system clock.
while (clock() - start < delay); // waiting for secs seconds.
***类型别名: clock_t 作为clock()返回类型的别名,编译器将把它转换为long,ynsigned int 或适合系统的其它类型.
建立方式:
i: 使用预处理器. #define clock_t unsigned int
ii: 用关键字typedef 创建别名: 将别名声明成为所需的类型,然后在前面加 typedef.
区别: typedef不会创建新类型,只为已有的类型建一新名称. 预处理则 使用替换的方法,有如下的缺点:
eg: #define F_P float *
F_P pa,pb;
编译器将其替换为: float * pa,pb; //pb不是如你所愿地声明为 float* ,而只是 float类型.
5.14 do while 循环, 为出口条件循环.
5.15 文本输入.
*** cin . 发送给cin 的输入被缓冲,只有按回车键后,它的输入的内容才被发送给程序. 而且cin 将忽略空白符.
*** cin.get(ch) 输入仍被缓冲,不过接收每个字符.输入的字符将被赋值给ch. ch必须为char类型,不能为int
cin.get(ch) 参数为引用: char & ,所以可以修改 ch, 否则参数需传入 &ch.
#*# cin.get(ch) 用于字符输入时返回 istream类对象,并转换为bool类型 true; 到达文件尾时,函数返回istream类对象,并转换为bool类型 false.
#*# int ch = cin.get() 用于字符输入时返回 int类型的字符编码; 达到文件尾时函数返回 EOF, 多数系统中被定义为 '-1'.
eg: while ((ch = cin.get()) != EOF){} whie (cin.get(ch)){}
cin.put(ch); //ch若为 int类型 需要转换为char 类型.
6. 分支语句和逻辑操作符
6.1 花絮
* if (3 == num)... // 如果错写为 3=num, 编译器会报错, 有些聪明的编译器会识别 if (num=3) 的错误.
* (17 < age <3 9) 等价于 ((17 < age) < 39)
* bool a,b; a && b, 若 a 为false, 则表达式 a && b 将不判断 b的值.
* and, or, not 在c++中为保留字; 但在C 语言中非保留字, 要使用 需加头文件: <iso646.h>
6.2 cctype 字符函数库 对所有字符编码通用.
有函数: isalpha9char) 非char返回0. ispunct(char) 输入为标点符号 返回true.
isspace(), isdigits() ......
6.3 switch 语句 标签都是整数常量表达式.
6.4 数字输入.
eg: int apple[10]; char ch;
while (ch !='Q' && cin>>apple[i]) //cin>>apple[i] 若输入非数字,则返回istream类对象,并转换为bool型 false.
while (!(cin>>apple[i]))
{
cin.clear(); // 如果输入非数字,cin返回 false, 并设置失效位,输入被阻断. 进入循环, 用cin.clear() 恢复输入
while (cin.get() != '\n') continue; //因为输入的非数字还留在输入队列,所以把它们清除,它们以 '\n'结束
}
欢迎大家提出批评和建议。