C++语句部分
C++语句部分
一、简单语句
;//表示一条空语句
while(1)
;//其实不是while语句结束了,而应该理解成while循环中一直在执行一条空语句
ival+5;//虽然没什么作用(没有赋值对象),但这个语句是合法的
语句块(复合语句)
while(val<10)
{
val++;
sum+=val;
}由于规定while语句后面只能跟一个语句,所以这个花括号表示将括号内的语句视为一条复合语句,也被称为“块”。
其他关于if-else语句、switch-case语句等花括号都表示这个意思
注意块语句不需要也不能以分号来结束语句
while(1){} while(1);
以上空快等同于空语句
条件语句
悬垂else
解释为:else总是和离它最近的、没有配对的if语句进行配对,从而消除程序的二义性。
if(grade%10 >= 3)
if(grade%10 > 7)
lettergrade += '+';
else
lettergrade += '-';
注意C++语言可不是用缩进来划分语句块的,以上的else和第二行的if语句进行匹配
switch-case语句
switch (ch)
{
case 1: //语句判定匹配条件,这里必须是常量表达式 constexpr
++cnt;
sum+=cnt;
cout<<sum;
break;
case 2:
--cnt;
sum+=cnt;
cout<<sum;
break;
}
需要注意的是:之前你总是习惯将case下面,break之前当成一个语句块,
但实际上case语句的作用域并不是仅仅有一条语句,实际上,当case满足
条件之后将一直执行下去,在发现break之前不断出,在当前case语句之
后的case下面的语句块也将被执行(即使不满足匹配条件)。
所以说:case之后不要加花括号当成语句块来处理,这是没必要的,同样
也是“不大气”的。
case 1:
string name;
int ival;
break;
case 2:
ival = 0;
break;
注意:以上这种变量定义在一个作用域内,但使用它时是在作用域之外,则不允许这种跳转。
还要区分:块内和块外,块内有没有被初始化?!没被初始化就是允许的???(待解决)
迭代语句
首先我建议你分清楚迭代和递归。
while语句以及do-while
while语句
形式是
while(condition)
statement;
condition为真时执行statement,condition不能为空,当condition第一次就为假,则statement一次都不执行。
其中condition部分是允许定义变量的,不会编译报错。
do-while语句
形式是
do{
statement;
}while(condition);
需要注意有一点与while不同的是,do-while语句中statement;无论如何都会被执行一次,condition是被之后判断的。所以说不允许在condition部分定义变量并将其应用于statement中
for语句
传统for语句
形式是
for(init-statemen; condition; expression)
statement;
其中init-statemen是可以被省略的,其中的初始化定义可以在for语句外面,但是用于分割的语句结束的分号不能少。
以下要特别强调for
语句的执行顺序!
1、首先是init-statemen,在循环开始时,这个只执行一次
2、其次是条件判断condition
a)条件为true
则执行statement;
a)条件为false
则直接断出
3、最后执行expression
想强调的就是第3、点,expression是最后执行的!!!这有利于你搞清for语句最后断出时一些变量/语句的最终状态。
for(decltype(v.size()) i, sum = 100; i!= sum; ++1)
//...
注意:for语句中开始的初始化定义可以有多个变量,但是类型声明只能有一个,即变量只能是同一类型的。
范围for语句
形式是
for(declaration: expression)
statement;
其中expression是一个序列,比如:一个vector、一个数组、一个string等等这些C++中的容器。而declaration则将在之后的循环中代表其中的序列元素。
示例代码
vector<int> v = {0,0,1,2,4,1,2,3};
for(auto a: v)
cout<<a<<endl;//将整个vector打印出
跳转语句
简述:
break语句:用于断出最近的一个迭代语句(for、while、do-while),以及switch语句。
continue语句:用于终止当点循环中的当前一次迭代(同样是最近的),但是仍会继续执行迭代,从下一次迭代开始继续执行,不允许在switch-case语句中单独使用,当switch-case语句外层存在迭代时才允许再其中使用continue语句。
goto语句:有点汇编语言的意味,当前不做解释,之后有用到时进行理解补充。
try语句以及异常处理
简述:
异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。典型的异常包括失去数据库连接以及遇到意外输入等。处理反常行为可能是设计所有系统最难的一部分.
以下try-throw-catch联动使用示例
while (cin >> i_1 >> i_2)
{
try {
if (i_2 == 0)
throw runtime_error("你输入了一个0值的除数,我们选择跳过");
cout << "相除结果是:" << i_1 / i_2 << endl;
}
catch (runtime_error err) {
cout << err.what() << endl;
cout << "要继续吗,输入【Y】继续循环" << endl;
char temp;
cin >> temp;
if (temp != 'Y')
break;
}
}
以上:try语句块是进行“测试”的,给出一些条件,看看程序是否可以正常执行
如果不能正常执行,(如此输入会产生错误),那么我们抛出(throw)一个类型的error
注意,如果此时发生了错误,也并不会打印输出,也不会继续执行之后try语句块中的语句
而是直接跳转到之后的catch语句块中继续执行。
进入catch语句块中可以用cout << err.what() << endl;的方式打印出刚刚发生的错误
信息,以及完成之后的处理工作。
其中err (异常类型)只定义了一个名为what的成员函数,没有任何参数,返回值是一个指
向C风格字符串的const char*,用于返回描述异常的文本信息。
catch语句块可以是一系列的,因为throw语句抛出的错误类型不一定相同,如下附带介绍一些类型的**标准异常**:
int ch = 0;
try {
switch (ch)
{
case 1:
exception("exception");
case 2:
runtime_error("runtime_error");
case 3:
range_error("range_error");
case 4:
overflow_error("overflow_error");
case 5:
underflow_error("underflow_error");
case 6:
logic_error("logic_error");
case 7:
domain_error("domain_error");
case 8:
invalid_argument("invalid_argument");
case 9:
length_error("length_error");
case 0:
out_of_range("out_of_range");
default:
break;
}
}
catch (exception err) {
//....
}
catch (invalid_argument err) {
//....
}
catch (out_of_range err) {
//....
}
//... ...
待解决的问题
1、于if-else语句、switch-case语句等其中{}代表的是语句块,那么用于函数定义时的{}代表的是什么含义呢?
2、switch-case语句的第二个语句块,没搞懂关于块内语句初始化以及相关的作用域的问题
3、关于while语句以及do-while语句中的定义变量,试过直接定义后编译不报错,但是具体使用过程中呢?你要实践一下试试。