学习笔记25:for 循环"/>
C++学习笔记25:for 循环
目录
一、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,然后判断计数器是否<5cout << "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=20cout << "a++ = " << a++ << ": ++b = " << ++b << "\n"; // 20,21cout << "a = " << a << ": b = " << b << "\n"; // 21,21return 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++中的关系运算符如下表所示:
关系运算符 操作符 含义 < 小于 <= 小于等于 == 等于 > 大于 >= 大于等于 != 不等于 注意:不要混淆关系运算符(==)和赋值运算符(=)!
更多推荐
C++学习笔记25:for 循环
发布评论