for循环的组成部分:
1. 设置初始值。
2. 执行测试,看看循环是否应当继续进行。
3. 执行循环操作。
4. 更新用于测试的值。
表达式和语句:
表达式:任何值和任何有效的值和操作符的组合都是表达式。每个C++表达式都有值。
语句:所有表达式加上分号,都可以成为语句。有的没有意义。
副作用和顺序点:
副作用:指在计算表达式时对某些东西(存储在变量中的值)进行了修改。
顺序点:程序执行过程中的一个点,进入下一步之前将确保对所有副作用都进行了评估。
前缀和后缀格式:
1 for (n = lim; n > 0; --n)
. . .;
2 for (n = lim; n > 0; n--)
. . .;
因为表达式(--n和n--)中的值均为被使用,只存在副作用。两条语句最终效果相同。
执行效率上有略微的差别,前缀版本效率较高。
递增/递减操作符和指针:
前缀递增、前缀递减和解除引用操作符的优先级相同,以从右向左的方式进行结合;
后缀递增和后缀递减的优先级高于前缀操作符 ,从左到右的方式结合;
double arr[5] = {21.1, 32.8, 23.4, 45.2, 37.4}; double *pt = arr; // pt指向arr[0],to 21.1 ++pt; // pt指向arr[1],to 32.8 *++pt; // *(++pt) 23.4 ++*pt; // ++(*pt) 24.4 (*pt)++; // 25.4 pt仍指向arr[2] *pt++; // 后缀操作符'++'的优先级更高,所以'++'的操作符用于pt,*pt++的值为25.4,pt指向arr[3]的地址
组合赋值操作符:
eg: += /= -= *= :
将结果赋给左侧操作数
关系表达式:
C++提供6种关系操作符来对数字、字符(ASCII码)和string类对象进行比较(不能用于C-风格字符串):
操作符 < <= == > >= !=
含义 小于 小于或等于 等于 大于 大于或等于 不等于
C-风格字符串比较:
strcmp() 函数接收两个字符串地址作为参数,参数可以是指针、字符串常量或者字符数组名。
strcmp(a,b) 头文件cstring:
如果两个字符串相同,该函数返回零;
如果a > b,返回一个正数;
如果a < b,返回负数
char字符变量可以使用递增操作符和递减操作符,因为char类型实际上是整型。(ch++,ch--)
比较string类字符串:
sting类字符串,类的设计能使用关系操作符进行比较;
While循环:
while循环没有初始化和更新部分的for循环,只有测试条件和循环条件:
while ( test_condition )
body
与for循环一样,while循环也是一种入口条件循环
for与while:
for与while本质相同;
使用for循环来为循环计数,for循环允许将所有相关信息—初始值、终止值和更新计数器放在一个地方;
在无法预知循环将执行的次数时,程序员常使用while循环
等待一段时间:编写延时循环
clock():返回程序开始执行后所用的系统时间,
问题一:clock() 返回的时间不一定是秒;
问题二:函数的返回类型下某些系统上可能是long,unsigned long或其他类型
头文件ctime提供了这些问题的解决方法:
解决问题一:定义符号常量:CLOCK_PER_SEC 每秒钟包含的系统时间单位数
解决问题二:将clock_t作为clock() 返回类型别名,把变量声明为clock_t
waiting.cpp
1 #include <iostream> 2 #include <ctime> 3 using namespace std; 4 5 int main() 6 { 7 cout << "Enter the delay time, in seconds: "; 8 float secs; 9 cin >> secs; 10 clock_t delay = secs * CLOCKS_PER_SEC; 11 cout << "staringa "; 12 clock_t start = clock(); 13 while(clock() - start < delay) 14 . 15 . 16 . 17 cout << "done a "; 18 return 0; 19 }
改程序以系统时间为单位(而不是秒)计算延迟时间,避免了在每轮循环中将系统时间转换为秒
类型别名:
C++为类型创建别名的方式有两种:
使用预处理器: #define BYTE char // 将BYTE声明为char类型别名
使用typedef: typedef char byte;
通用格式:typedef typeName aliasName; // 将aliasName声明为typeName类型的别名
typedef char* byte_pointer; // 将byte_pointer声明为 char指针别名
typedef是一种更加的选择——有时候也是唯一的选择
注意:typedef 不会创建新类型,只是为已有的类型创建别名
do while循环:
do while 是出口条件循环,先执行循环体,再判定测试表达式,决定是否继续执行循环;
eg:
do
{
cin >> n;
} while( n != 7);
程序必须先进入循环体获得输入。
循环和文本读取:
使用原始的cin进行输入:
程序清单 testin1.cpp
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 char ch; 7 int count = 0; 8 cout << "Enter characters; enter # to quit: "; 9 cin >> ch; 10 while( ch != '#') 11 { 12 cout << ch; 13 ++count; 14 cin >> ch; 15 } 16 cout << endl << count << "characters read "; 17 return 0; 18 }
cin在读取char值时(cin >> ch),与读取其他基本类型一样,忽略空格和换行符;
操作系统回显输入:see ken run#really fast <Enter>;
测试程序回显输入:seekenrun;
发送给cin的输入被缓冲,回车后,输入内容被发送给程序
使用cin.get(char)进行补救:
字符读取程序要检查每个字符,包括空格、制表符和换行符。cin所属的iostream类中包含成员函数cin.get (ch) 读取输入中的下一个字符赋给变量ch;
替换 textin1.cpp 中 cin >> ch :
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 char ch; 7 int count = 0; 8 cout << "Enter characters; enter # to quit: "; 9 cin.get(ch); 10 while( ch != '#') 11 { 12 cout << ch; 13 ++count; 14 cin.get(ch); 15 } 16 cout << endl << count << "characters read "; 17 return 0; 18 }
头文件 iostream 将 cin.get (ch) 函数原型的参数声明为引用类型,因此该函数可以修改其参数的值
cin.get 函数重载:
C++支持被称为函数重载的OOP特性——允许创建多个同名函数,参数列表不同
cin.get ( name, ArSize ):编译器使用接受参数 char* 和 int 版本;
cin.get (ch):编译器使用接收一个参数 char 版本 ,返回一个cin对象; cin.get(ch1) .get(ch2);
cin.get():不接收任何参数的成员函数返回输入中的下一个字符,ch = cin.get (),将字符编码作为 int 值返回
文件尾条件EOF:
while ( cin.fail () == false ) // 检测EOF
常见的字符输入做法:
cin.get (ch);
while ( cin.fail() == false) or while ( !cin.fail() ) or while ( cin.get( ch) )
{
. . .
cin.get ( ch );
}
cin.get( char ) 返回值是一个cin对象,iostream类提供一个将istream对象转换为bool值的函数