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,然后判断计数器是否<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++中的关系运算符如下表所示:

关系运算符
操作符含义
<小于
<=小于等于
==等于
>大于
>=大于等于
!=不等于

        注意:不要混淆关系运算符(==)和赋值运算符(=)!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值