for循环的格式为(注意,i需要声明,i可以用其他变量替代):
for(循环初始化; 循环测试; 循环更新}{循环体}
for(i的初始化; i的判断语句符合则执行括号内的代码; 符合后i的值增加或者减少){执行的代码;}
例如代码:
#include<iostream> int main() { using namespace std; int a = 10,i; //初始化a=10,声明i cout << "a = " << a << endl; //输出a的值 for (i = 0;i < 5;i++) { a = a + 5; //a+5 cout << "a + 5 = " << a << " 。i = " << i << endl; //输出a+5后的值,然后输出i的值 }; cout << "i = " << i << endl; //输出结束循环后i的值 cout << "a = " << a << endl; //输出结束循环后a的值 system("pause"); return 0; } 输出: a = 10 a + 5 = 15 。i = 0 a + 5 = 20 。i = 1 a + 5 = 25 。i = 2 a + 5 = 30 。i = 3 a + 5 = 35 。i = 4 i = 5 a = 35 请按任意键继续. . .
结论:
①在for后面的小括号内,三部分分别是:
(1)初始化变量i,且无论循环多少遍,初始化只执行一遍;
(2)判断语句,假如判断成立,则执行大括号内的程序,不成立,则结束for语句;
(3)变量i变化,用于制定执行多少遍语句。注意:假如是for(i=1;i<5;i++){a=a+1;}这一行代码,假如判断成立,先执行a=a+1,再执行i++。即先执行大括号里循环语句,再执行小括号内变化语句,相当于把第三段语句放在大括号内的循环语句最后进行执行。
②假如在for的小括号后面,不用大括号,比如:
for(i=1;i<5;i++)
cout<<"123"<<endl;
cout<<"456"<<endl;
那么循环执行的就是小括号后面第一行代码,而不是执行后面两行代码。
假如将两行代码都用大括号括起来,那么就是执行括起来的代码。
③循环执行步骤为:
(1)循环进行初始化,如i=1;
(2)执行测试,判断是否符合要求,如i=1的确符合i<5;
(3)执行循环体,如cout<<"abc<<endl;
(4)循环更新,如i++。
然后跳到(2)开始执行测试,如果成立则跳到(3);
如果不成立,则结束循环,从(2)跳到(5)。
(5)执行循环后的第一行语句
④循环的测试语句的原理:
原理是判断表达式的bool值(bool值分true和false,true的值为1,flase的值为0),如果符合(为true),则结果转为1;如果不符合,则将结果转为0。
比如i<5; 假如i=1,的确小于5,于是i<5被值1替代,然后测试语句在执行的时候发现结果是1,那么执行循环语句。
又比如i=5,5不小于5,于是i<5被值0替代,测试语句在执行的时候,发现结果是0,于是结束执行循环语句。
正因为如此,假如我们把代码改为for(i=1;1;i++),那么就会无限执行循环体。
又假如把代码改为for(i=1;0;i++),那么就不会执行循环体。
⑤在循环初始化语句里进行声明:
例如for (int i=1;i<5;i++)。这样是有效的。
但问题在于在结束循环之后,执行循环外的代码时,i是无效的,会被认为,未被声明。
表达式的值:
例如表达式 a==540; 320<350; 1>5; 这样等的表达式。(注:不包括赋值符号=)
他们实际上都是有值的,值的表达形式是true或者flase。
例如 320<350的值是true,而1>5的值是false,a==540在不知道a的值时,是不确定的。
如代码:
#include<iostream> int main() { using namespace std; int a = 5; cout << "a<3的值是" << (a < 3) << endl; cout << "a>3的值是" << (a > 3) << endl; cout.setf(ios_base::boolalpha); //以true或者false的形式显示结果 cout << "a<3的值是" << (a < 3) << endl; cout << "a>3的值是" << (a > 3) << endl; cout << 1 << endl; system("pause"); return 0; }
输出
a<3的值是0
a>3的值是1
a<3的值是false
a>3的值是true
1
请按任意键继续. . .
注意:
①表达式(a<3)的结果是bool类型,但由于cout默认显示为int类型,因此,(a<3)被显示为0,而(a>3)被显示为1;
②cout.setf(ios_base::boolalpha);的作用就是,让cout正常显示bool类型,于是true被正常显示为true,而false被正常显示为flase。
③但是cout.setf(ios_base::boolalpha);不会将int类型的数字显示为bool类型的,因此,常量1依然被正常显示为1;
④表达式和语句的差别在于,表达式加上分号即为一行语句,但语句去掉分号不一定是表达式。如a>5是表达式,a>5;是语句。
但表达式变语句不一定有意义。例如a<5,然后cout<<(a<5)<<endl;并不能让输出变为true。
利用循环计算阶乘:
代码;
//计算阶乘 #include<iostream> int main() { using namespace std; long long a=1, i=1; //使用long long格式是因为只有这样才能足够容纳结果 for (i = 1;i < 16;i++) { a = i*a; //算法是当前数,乘以之前数相乘的积。 //如1的阶乘是1,2的阶乘是1的阶乘再乘以2。a代表之前数的阶乘,i代表现在的数 cout << i << "!=" << a << endl; //i输出是当前数,a为当前数的阶乘 } system("pause"); return 0; }
输出:
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 请按任意键继续. . .
利用循环给字符串不同字符赋值
上代码:
//自动给char类型字符赋值 #include<iostream> int main() { using namespace std; int i ; //声明int变量i char abc[12]; //声明字符串abc,共有11个元素和最后的空字符 for (i = 0;i < 10;i++) { abc[i] = char(i+97); //第1个元素编号为0,被赋值为ASCII编码97+i的字符,注意,编码97为小写a cout << "abc[" << i << "] = " << abc[i] << endl; } //在i=10的时候,由于不再执行abc[i]=char(i+97);因此char[10]没有被赋值 //char [i]=char(i+97) 这行代码可以显示abc[10] for (i = i;i >= 0;i--) { cout << "abc[" << i << "] = " << abc[i] << endl; //倒着显示一遍,一直显示到char[0] } i = 10; abc[i] = char(i + 97); abc[11] = '\0'; //因为字符串是显示到空字符为止,代码值给abc字符串的每个字符赋值,但最后并没有给最后的空字符的位置赋值空字符 //如果缺了这一行代码,显示abc的时候,在最后会显示 “烫烫烫烫”,是因为没有空字符的原因。 cout << "abc = " << abc << endl; system("pause"); return 0; }
输出:
abc[0] = a abc[1] = b abc[2] = c abc[3] = d abc[4] = e abc[5] = f abc[6] = g abc[7] = h abc[8] = i abc[9] = j abc[10] = abc[9] = j abc[8] = i abc[7] = h abc[6] = g abc[5] = f abc[4] = e abc[3] = d abc[2] = c abc[1] = b abc[0] = a abc = abcdefghijk 请按任意键继续. . .
注意:
①从abc[0]~abc[10]是11个元素,但是字符串的特点是,结尾是空字符,因此在声明的时候,需要是12个成员,即char abc[12];
假如是char abc[11];那么最后就会出问题。
②字符a的ASCII编码是97,第一个元素是0,所以abc[0]=char97; 这样abc[0]就是a了。
③空字符的赋值方法是:字符串名[最后一个编号]='\0';其中\0是空字符。