C++每日一课(十七)

for循环


使用循环的主要目的是为了让程序去执行一些重复的任务。
/*
作者:xiesheng
时间:2017-07-09
版本:v1.0
说明:for循环
*/
#include <iostream>


int main() {
	using namespace std;
	int i;
	for (i = 0; i < 5; i++)
		cout << "C++ for 循环!" << endl;
	cout << "C++ for循环结束!" << endl;


	system("pause");
	return 0;
}




C++ for 循环!
C++ for 循环!
C++ for 循环!
C++ for 循环!
C++ for 循环!
C++ for循环结束!
请按任意键继续. . .


上面的程序就是一个简单的for循环
循环先把整数变量i设置为0:i=0 这部分是表示循环初始化部分
i<5 这个部分就是循环测试,检查i是否小于5
cout << "C++ for 循环!" << endl; 这个是循环体
i++ 这个是循环的更新


循环的更新使用了++运算符,它是一个递增运算符,它会把操作数的值加1,对于递增运算符不仅仅只是使用在for循环中
在i++中也可是使用i=i+1来做代替
在上面把i加1后则完成了一个周期的循环,接下来就会进入到新的周期中去,把新的值再在循环测试中去对比,如果对比的结果还是true则继续循环体、循环更新再进入新的一轮测试,这一过程会持续进行至到测试结果不通过时则跳过循环体执行后面的语句。


for循环的组成部分
1.设置初始值
2.执行测试
3.执行循环操作
4.更新用于测试的值
其中初始化、测试和更新操作构成了控制部分,这些操作使用括号括起来。其中每一部分都是一个表达式,使用分号进行分隔
控制部分后面的语句叫做循环语句


for(initial;test-exper;update-expr)
    body
……
C++语法把整个for看作为一条语句,虽然循环体可以包含一条或是多条语句(注意:在包含多条语句的时候需要使用复合语句或代码块)


对于初始化来说,只会执行一次
test-exper表达式,决定了循环体是否被执行,通常来说这个表达式是一个关系表达式,即对两个值进行比较。如果两个值比较为true则执行循环体为false则不执行循环体
注意:C++并没有把test-exper的值限制为只能为直或假,可以使用任意的表达式,C++会把其结果强制转换为bool类型。


/*
作者:xiesheng
时间:2017-07-09
版本:v1.0
说明:for循环
*/
#include <iostream>


int main() {


	using namespace std;
	cout << "输入最大的数值:";
	int limit;
	cin >> limit;
	int i;
	for (i = limit; i; i--)
		cout << "i=" << i << endl;
	cout << "现在i的值是:" << i << endl;


	system("pause");
	return 0;
}




输入最大的数值:5
i=5
i=4
i=3
i=2
i=1
现在i的值是:0
请按任意键继续. . .


for循环是入口条件循环。这就意味着在每轮循环之前,都将计算测试表达式的值,当测试表达式为false,则不会执行循环体
update-exper更新表达式,在每轮循环结束时执行,此时循环体已经执行完。通常来说它用来跟踪循环轮次的变量的值进行增减。
C++中通常是会在for和括号之间加上一个空格,而省掉函数名与括号之间的空格


for (i = limit; i; i--)
    functionName(i);


对于while和if处理的方式与for相似。
for语句的控制部分使用3个表达式。
任何值或任何值和运算符的组合都是表达式。比如10就是值为10的表达式,1*2是值为2的表达式
在C++中x = 20也是一个表达式,这个表达式的值就是左侧成员的值,因而这个表达式的值是20
i = (j = 4) + 3;
表达式j=4的值为4,i的值这个时候就是为7


/*
作者:xiesheng
时间:2017-07-09
版本:v1.0
说明:for循环中表达式
*/
#include <iostream>


int main() {


	using namespace std;
	int x;


	cout << "表达式x=100的值为:" << (x = 100) << endl;
	cout << "x = " << x << endl;
	cout << "表达式x<3的值为:" << (x < 3) << endl;
	cout << "表达式x>3的值为:" << (x > 3) << endl;
	
	cout << "使用cout.setf(ios_base::boolalpha);语句后输出的结果:" << endl;
	cout.setf(ios_base::boolalpha);


	cout << "表达式x<3的值为:" << (x < 3) << endl;
	cout << "表达式x>3的值为:" << (x > 3) << endl;


	system("pause");
	return 0;
}




表达式x=100的值为:100
x = 100
表达式x<3的值为:0
表达式x>3的值为:1
使用cout.setf(ios_base::boolalpha);语句后输出的结果:
表达式x<3的值为:false
表达式x>3的值为:true
请按任意键继续. . .


通常,cout在显示bool值之前会把它们转为int,但是cout.setf(ios_base::boolalpha);函数的调用设置了一个标记,这个标记命令cout显示true和false而不是1和0。
为了判定表达式x=100,C++必须把100赋值给到x。当判定表达式的值这种操作改变愉存中数据的值时,我们说表达式有副作用。
判定赋值表达式会带来副作用,会修改赋值者的值。
有可能把赋值看作为预期效果,但从C++的构造方式这个角度来看,判定表达式才是主要作用。并非所有的表达式都有副作用。
x+1这样的表达式就没有副作用因为它并没有改变x的值,++x+1这个表达式则有副作用,它把x加1。


从表达式到语句的转变则只需要在表达式后面加上分号;就可以了
age = 10 这是一个表达式
age = 10; 这是一个语句


语句正确不一定都有意义
比如 m+1; 这是一个语句,编译器是允许这样的语句的,但是这样的语句没有任何意义,程序中计算了和但是并没有使用最终计算后的结果就进入了下一条语句。


非表达式语句
对于任何表达式来说加上了分号都可以成为语句,但是反过来就不一定对了。
从语句中删除掉分号不一定是表达式
比如:
int i; 但是int i并不是一个表达式,因为它没有值


for的原来语法是如下的:
for(exper;exper;exper)
    statement
for结构的控制部分由三个表达式组成,它们之间使用分号分隔
C++允许如下
for(int i=0;i<5;i++)
for循环的初始化部分中声明变量。但是记住int i = 0;这不是一个表达式 为了支持这种for语句中的句法修改如下
for(for-init-statemnet condition;experssion)
   statement
注意这里的for-init-statement为什么没有分号?因为它是一个语句,语句本身就带有分号的。
有一点要注意的就是在for中声明的变量在离开for循环后就会消失。


阶乘
阶乘的计算方法如下:
0的阶乘为1
1的阶乘  = 1*0的阶乘
2的阶乘 = 2*1的阶乘
……


/*
作者:xiesheng
时间:2017-07-09
版本:v1.0
说明:for循环中计算阶乘
*/
#include <iostream>


//定义一个整型常量
const int ArSize = 16;


int main() {


	long long fac[ArSize];	//定义一个数组
	fac[1] = fac[1] = 1LL;
	for (int i = 2; i < ArSize; i++) {
		fac[i] = i*fac[i - 1];
	}
	//打印计算出来的值
	for (int i = 0; i < ArSize; i++) {
		std::cout << i << "! = " << fac[i] << std::endl;
	}
	std::cout << std::endl;


	system("pause");
	return 0;
}




0! = 90580654134129548
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000


请按任意键继续. . .


上面程序中使用const值来表示数组中元素的个数是一个好办法,这样在调整数组长度的时候只需要改这个常量的值即可,而不需要把程序中每一个涉及到的地址都做修改。


程序中在main()函数外面声明const int 变量,这样可以使用这个常量成为外部数据,它会使用得数据在整个程序周期内都存在,程序文件中的所有函数都可以使用它。


上面的程序中每一轮循环完成后计数加1或者减1,可以通过修改更新表达式来修改步长。


/*
作者:xiesheng
时间:2017-07-09
版本:v1.0
说明:for循环中修改步长
*/
#include <iostream>


int main() {


	using std::cout;
	using std::cin;
	using std::endl;


	cout << "请输入一个整数:" << endl;
	int by;
	cin >> by;
	cout << "步长是:" << by << endl;


	for (int i = 0; i < 100; i = i + by)
		cout << i << endl;


	system("pause");
	return 0;
}




请输入一个整数:
12
步长是:12
0
12
24
36
48
60
72
84
96
请按任意键继续. . .


for循环访问字符串


/*
作者:xiesheng
时间:2017-07-09
版本:v1.0
说明:for循环访问字符串
*/
#include <iostream>
#include <string>


int main() {


	using namespace std;
	cout << "请输入一个字符串:";
	string word;
	cin >> word;
	//返向输出字符串中各个字符
	for (int i = word.size() - 1; i >= 0; i--)
		cout << word[i];
	cout << endl << "输入完成!" << endl;


	system("pause");
	return 0;
}




请输入一个字符串:xiesheng
gnehseix
输入完成!
请按任意键继续. . .




递增和递减运算符
递增运算符++
递减运算符--


这两个运算符有两种变体
前缀版:操作符在前面 ++x
后缀版:操作符在后面 x--
以上的两个版本最终的结果是一样的,但是对操作数来说影响的时间是不同的。


/*
作者:xiesheng
时间:2017-07-12
版本:v1.0
说明:++、--运算符
*/
#include <iostream>


int main() {


	using std::cout;
	int a = 20;
	int b = 20;
	cout << "a = " << a << " ; b = " << b << std::endl;
	cout << "a++ = " << a++ << " ; ++b = " << ++b << std::endl;
	cout << "a-- = " << a-- << " ; --b = " << --b << std::endl;




	system("pause");
	return 0;
}



a = 20 ; b = 20
a++ = 20 ; ++b = 21
a-- = 21 ; --b = 20
请按任意键继续. . .


从结果来看,a++会使用a的当前值作为计算表达式的值,然后把工的值+1;++b会把b的值+1后的值作为计算表达式的值。


C++中的副作用和顺序点
1.副作用
在计算表达式中对某些存储在变量中的值时行了修改
2.顺序点
程序在执行过程中的一个点,在这里,进入下一条语句之前将确保对所有的副作用都进行了评估。
C++中,语句中的分号就是一个顺序点,这意味着程序处理下一条语句之前,赋值运算符、递增运算符和递减运算符执行的所有修改都必须完成。
注意:如下两个语句
for(n = lim;n>0;--n)
……


for(n = lim;n>0;n--)
……
上述的两种写法对于C++来说是完全一样的,因为最后的--n,n--都是完整的表达式,C++会把程序进入下一步之前把所有的副作用都处理完。
然而上述的两种写法在执行速度上是存在差异的
对于内置类型来说采用前缀版本与后缀版本是不会有差异的,但是对于用户定义的类型,使用前缀格式的效率会更好。

猜你喜欢

转载自blog.csdn.net/advent86/article/details/75042367