c++循环和关系表达式
一、for循环
1.for的组成
for循环为执行重复的操作提供了循序渐进的步骤。for循环的组成部分步骤:
- 设置初始值。
- 执行测试,看看循环是否应当继续进行。
- 执行循环操作。
- 更新用于测试的值。
循环设计中的要素:初始化、测试和更新操作构成控制部分,由括号括起。每个部分都是表达式,由分号隔开。控制部分后面的语句叫做循环体,只要测试为true,循环值执行一次,便执行:
for(initialization//初始化;test-expression//测试;update-expression//更新)
body
实例:
#include <iostream>
using namespace std;
int main()
{
int i;
for(i=0;i<5;i++)
{
cout<<"c++ knows loops"<<endl;
}
cout<<"c++ knows when to stop"<<endl;
return 0;
}
注:i=0表示循环的初始化部分,测试条件部分i是否小于5:i<5;
当小于5,程序执行循环体,直到大于5结束循环。
2.表示式和语句
-
for语句的控制部分使用3个表达式,由于自身强加的语法限制,c++成为非常具有表现力的语言,任何值或任何有效的值和运算符组合都是表达式。例如:
28*20
是指为560的表达式。 -
c++将赋值表达式的值定义为左侧成员得值。由于赋值的表达式有值,因此,可以编写下面语句:
maids=(cooks=4)+3;
表达式cooks=4的值为4,因此maids的值为7。 -
像x<y这样的关系表达式将被判定为 bool值true或false。
实例:<<运算符
的优先级比表达式中使用的运算符高,因此代码使用括号来获得正确的运算顺序。
#include <iostream>
using namespace std;
int main()
{
int x;
cout<<"The expression x=100 has the value";
cout<<(x=100)<<endl;
cout<<"Now x= "<<x<<endl;
cout<<"The expression x < 3 has the value";
cout<<(x<3)<<endl;
cout<<"The expression x >3 has the value";
cout<<(x>3)<<endl;
cout.setf(ios_base::boolalpha);
cout<<"The expression x< 3 has the value";
cout<<(x<3)<<endl;
cout<<"The expression x > 3 has the value";
cout<<(x>3)<<endl;
return 0;
}
注:
cout.setf(ios_base::boolalpha)
是c++一项新功能,ios_basee::boolalpha
来作为cout.setf()
的参数,老式:ios:boolalpha.
。- cout在显示
bool
值之前将他们转换int,但cout.setf(ios::boolalpha)
函数调用设置了一个标记,该标记命令cout显示true和false,而不是1和0。
3.非表达式和语句
- 项目1
- 项目2
- 项目3
对任何表达式加上分号都可以成为语句,但是语句反过来说的就不对了。也就是说,从语句中删除分号,并不一定能将它转换为表达式。目前,我们使用的语句而言,返回语句,声明语句和for语句都不满足语句=表达式+分号
这种模式。
//一条语句:
int toad;
//但int toad并不是表达式,因为它没有值,下面代码是非法:
egg=int toad * 1000;
cin>>int toad;
//禁止将for循环赋给变量
//for 循环不是表达式,因此没有值,也不能赋值。
int fx=for(i=0;i<4;i++)
cout>>i;
for循环形式:
//形式1:
int i;
for(i=0;i<5;i++)
//形式2:
for(int i=0;i<5;i++)
4.使用for循环访问字符串
for循环提供了一种依次访问字符串中每个字符,使用string对象,char数组,因为它们都能够使用数组表示法来访问字符串的字符。
#include <iostream>
#include<string>
using namespace std;
int main()
{
cout<<"Enter a word:";
string word;
cin>>word;//用户输入一个字符串
//按相反的方向逐个字符的显示字符串
//使用关系运算符大于或等于来测试是否达第一个元素
for(int i=word.size()-1;i>=0;i--)//size()获得字符数。
cout<<word[i];
cout<<"\nBye.\n";
return 0;
}
二、递增(++)和递减(–)
1.副作用和顺序点
-
副作用指的是在计算表达式时对某种东西(如存储在变量值中的值)进行修改;
-
顺序点是程序执行过程中的一个点,在这里,进入下一步之前将确保对所有的副作用都进行评估。
-
在C++中,语句中的分号就是个顺序点,意味着程序执行下一条语句之前,赋值运算符、递增运算符和递减运算符执行的所有修改都必须完成。
-
任何完整的表达式末尾都是个顺序点,表达式不是另一个更大表达式的子表达式。
//完整表达式的例子:表达式语句中的表达式部分以及用作while循环中检测条件的表达式:
while(guests++ < 10)
cout<<guests<<endl;
//guests++<10是个完整表达式,是个while循环的测试条件,因此该表达式的末尾是个顺序点。
//C++确保副作用(将guests+1)在程序进入cout之前完成。然而,通过使用后缀格式,可确保将guests同10进行比较后将值加1。
y=(4+x++) +(6 +x++);
//4+x++不是个完整的表达式,c++不保证x的值在计算表达式4+x++后立刻增加1。
//整条赋值语句是个完整表达式,分号标识了顺序点。
//因此C++只保证程序执行到下一条语句之前,x的值被递增两次。
//C++没有规定在计算每个子表达式之后将x的值递增,还是在整个表达式计算后将x的值递增。
在c++11中,不再使用术语“顺序点
”了,因为这个概念难以用于讨论多线程执行。相反,使用了术语“顺序
”,表示有些事在其他事件前发生。
2.前缀格式和后缀格式
若某些变量被用于某些目的(如用作函数参数或给变量赋值),使用前缀格式和后缀格式的结果将不同。然而,如果递增表达式的值没有被使用,情况如何?例如,下面两条语句的作用是否不同?
x++