目录
一、for 循环的组成部分
二、递增运算符(++)和递减运算符(--)
三、组合赋值运算符
四、复合语句(语句块)
五、逗号运算符
六、关系表达式
一、for 循环的组成部分
? ? ? ? for 循环为执行重复的操作提供了循序渐进的步骤。for 循环由控制部分(初始化表达式、测试表达式和更新表达式,三个表达式用分号隔开)和循环体组成,如图所示,它们完成下面这些步骤:
? ? ? ? ①. 由初始化表达式设置初始值(仅在开始 for 循环时执行一次初始化)。? ? ? ? ? ②. 由测试表达式执行测试,看看循环是否应当继续进行。 ? ? ? ? ③. 执行循环体部分的循环操作。 ? ? ? ? ④. 由更新表达式更新用于测试的值。 ? ? ? ?下面是 for 循环的一个示例程序:
//forloop.cpp -- introducing the for loop
#include <iostream>
using namespace std;
int main()
{
int i; //创建计数器
for ( i = 0; i < 5; i++) //将计数器初始化为0,然后判断计数器是否<5
cout << "C++ knows loops.\n"; //如果计数器<5,执行for循环内部语句,然后计数器递增i++,继续判断
cout << "C++ knows when to stop.\n"; //当计数器不<5时,跳出for循环,执行for循环后面的语句
return 0;
}
? ? ? ? 示例程序中在 for 循环之前声明了一个整型变量 i 作为 for 循环的计数器,C++中同样允许用户在初始化表达式中声明变量,如示例程序中可省略 for 循环之前的变量声明,直接在 for 循环控制部分的初始化表达式中声明: ? ? ? ? for ( int i = 0; i < 5; i++) ????????for 循环是入口条件(entry-condition)循环,即在每轮循环之前,都将计算测试表达式的值,当测试表达式为 true 时执行循环体,当测试表达式为 false 时,终止循环。
二、递增运算符(++)和递减运算符(--)
? ? ? ? 这两个运算符执行两种极其常见的循环操作:将循环计数加1或减1。?这两个运算符都有两种变体,前缀(prefix)版本位于操作数之前,如 ++x;后缀(postfix)版本位于操作数之后,如 x++。两个版本对操作数的影响是一样的(x=x+1),但是影响的时间不同,如下面的示例程序:
//plus_one.cpp -- 递增运算符和递减运算符
#include <iostream>
int main()
{
using std::cout;
int a = 20;
int b = 20;
cout << "a = " << a << ": b = " << b << "\n"; // a=20,b=20
cout << "a++ = " << a++ << ": ++b = " << ++b << "\n"; // 20,21
cout << "a = " << a << ": b = " << b << "\n"; // 21,21
return 0;
}
? ? ? ? a++ 意味着使用 a 的当前值计算表达式,然后将 a 的值加1;而 ++b 的意思是先将 b 的值加1,然后使用新的值来计算表达式。示例: ????????x = 5,y = x++ 或 y = ++x ????????x++ 意味着先用? x的当前值计算表达式,再将 x+1,所以 y = 5,x = 6; ????????++x 意味着先将 x+1,再计算表达式,所以 y = 6,x = 6。 ? ? ? ? 千万不要在同一条语句对同一个值递增或递减多次。 ? ? ? ? 显然,如果变量被用于某些目的(如用作函数参数或给变量赋值),使用前缀格式和后缀格式的结果将不同;如果递增(递减)表达式的值没有被使用(如 for 循环中的更新表达式),则二者没有区别(对于用户定义的类型,前缀版本效率更高)。
? ? ? ? 可以结合递增或递减运算符和解除引用(*)运算符来修改指针指向的值。将什么解除引用、将什么递增(递减)取决于运算符的位置和优先级: ????????前缀递增、前缀递减和解除引用运算符的优先级相同,以从右到左的方式进行结合。例如: ? ? ? ? *++pt——先将 ++ 应用于 pt,然后将 * 应用于递增后的 pt; ? ? ? ? ++*pt——先取得 pt 指向的值,然后将这个值加1,此时 pt 仍指向原地址。 ? ? ? ? 后缀递增和后缀递减的优先级相同,但比前缀运算符的优先级高,这两个运算符以从左到右的方式进行结合。例如: ? ? ? ? (*pt)++——先取得 pt 指向的值,然后将这个值加1,此时 pt 仍指向原地址; ? ? ? ? *pt++——先取得 pt 指向的值,然后将 pt 递增,此时 pt 指向下一个元素的地址。
三、组合赋值运算符
? ? ? ? 每个算术运算符都有其对应的组合赋值运算符,如下表所示:
组合赋值运算符
操作符 | 作用(L为左操作数,R为右操作数) | += | 将 L+R 赋给 L | -= | 将 L-R 赋给 L | *= | 将 L*R 赋给 L | /= | 将 L/R 赋给 L | %= | 将 L%R 赋给 L |
四、复合语句(语句块)
? ? ? ? 前面提到 for 循环的循环体必须是一条语句,如果要在循环体中包含多条语句,C++提供了复合语句(语句块、代码块)的方式:由一对花括号和它们包含的语句组成,被视为一条语句。?如下面示例程序所示:
//block.cpp -- 复合语句(语句块)
#include <iostream>
using namespace std;
int main()
{
cout << "The Amazing Accounto will sum and average ";
cout << "five numbers for you.\n";
cout << "Please enter five values:\n";
double number;
double sum = 0.0;
//用两个花括号构造一条复合语句(代码块)
for (int i = 1; i <= 5; i++)
{ //语句块开始花括号
cout << "Value " << i << ": "; //花括号中所包含的语句被视为一条语句
cin >> number;
sum += number;
} //语句块结束花括号
cout << "Five exquisite choices indeed! ";
cout << "They sum to " << sum << endl;
cout << "and average to " << sum / 5 << ".\n";
cout << "The Amazing Accouto bids you adieu!\n\n";
return 0;
}
??????????语句块的特性:在外部语句块中定义的变量在内部语句块中也是被定义了的。如果在语句块中定义了一个新的变量,则仅当程序执行该语句块中的语句时,该变量才存在,执行完该语句块后,变量将被释放,这表明此变量仅在该语句块中是可用的。示例: ????????int x = 20; ????????{ ????????????????int y = 100; ????????????????cout << x << endl; ????????????????cout << y << endl; ????????} ????????cout << x << endl;? ? ? ? ? ? ? ? //x=20,因为 x 是在语句块之前声明的 ????????cout << y << endl; ? ? ? ? ? ? ? ?//不能输出 y,因为 y 是在上面语句块中声明的 ????????如果在一个语句块中声明一个变量,而外部语句块中也有一个这种名称的变量,则在声明位置到内部语句块结束的范围内,新变量将隐藏旧变量,然后旧变量再次可见。示例: ????????int m = 100; ????????{ ????????????????cout << m << endl; ? ? ? ?//使用m的原始值,输出100 ????????????????int m = 50; ? ? ? ? ? ?? ????????????????cout << m << endl; ? ? ? ?//使用m的新值,输出50 ????????} ????????cout << m << endl;? ? ? ? ? ? ? ? //使用m的原始值,输出100
五、逗号运算符
? ? ? ? 在C++中,可以使用逗号运算符将两个表达式放到C++句法只允许放一个表达式的地方。如下面示例程序中 for 循环控制部分的初始化表达式和更新表达式:
// forstr2.cpp -- reversing an array
#include <iostream>
#include <string>
int main()
{
using namespace std;
cout << "Enter a word: ";
string word;
getline(cin, word);
char temp;
int i, j; // 逗号作为列表分隔符
for ( j = 0,i = word.size() - 1; j < i ; --i,++j) // 逗号运算符
{
temp = word[i];
word[i] = word[j];
word[j] = temp;
}
cout << word << "\nDone.\n";
return 0;
}
????????逗号并不总是逗号运算符,例如在声明变量时(int i, j),逗号只是一个列表分隔符。 上面的示例程序中可以去掉 int i, j;的变量声明语句,直接在 for 循环控制部分的初始化表达式中利用逗号运算符写成:int?j = 0, i = word.size() - 1; 。 ? ? ? ? 逗号运算符的特性:首先,它确保先计算第一个表达式,然后计算第二个表达式。其次,C++规定,逗号表达式的值是第二部分的值。
六、关系表达式
? ? ? ? 在C++的关系表达式中,可利用关系运算符对数字、字符(不能将它们用于C-风格字符串,但可用于 string 类对象,C-风格字符串应使用库函数 strcmp()进行比较)进行比较,对于所有关系表达式,如果比较结果为真,则其值将为 true,否则为 false。C++中的关系运算符如下表所示:
关系运算符
操作符 | 含义 | < | 小于 | <= | 小于等于 | == | 等于 | > | 大于 | >= | 大于等于 | != | 不等于 |
? ? ? ? 注意:不要混淆关系运算符(==)和赋值运算符(=)!
|