条件语句

if语句

if 语句根据特定表达式是否为真来有条件地执行另一个语句。if 语句有两种形式:其中一种带 else 分支而另一种则没有。根据语法结构,最简单的 if 语句是这样的:

if (condition)
statement

其中的 condition 部分必须用圆括号括起来。

通常,statement 部分可以是复合语句,即用花括号括起来的块语句。

如果在条件表达式中定义了变量,那么变量必须初始化。将已初始化的变量值转换为 bool 值后,该 bool 值决定条件是否成立。变量类型可以是任何可转换为 bool 型的类型,这意味着它可以是算术类型或指针类型。

语句块用作 if 语句的对象

当多个语句必须作为单个语句执行时,比较常见的错误是漏掉了花括号。

在下面的程序中,与程序员缩进目的相反,对 occurs 的赋值并不是 if 语句的一部分:

// error: missing curly brackets to make a block!
if (minVal > ivec[i])
minVal = ivec[i];
occurs = 1; // executed unconditionally: not part of the if

这样写的话,对 occurs 的赋值将会无条件地执行。这种错误很难发现,因为程序代码看起来是正确的。

if 语句的 else 分支

if else 语句的语法形式为:

if (condition)
statement1
else
statement2

如果 condition 为真,则执行 statement1;否则,执行 statement2。

悬垂 else

所有语言的 if 语句都普通存在着潜在的二义性。这种情况往往称为悬垂 else 问题,产生于一个语句包含的 if 子句多于 else 子句时:对于每一个 else,究竟它们归属哪个 if 语句?

C++中悬垂 else 问题带来的二义性,通过将 else 匹配给最后出现的尚未匹配的if 子句来解决。

有些编程风格建议总是在 if 后面使用花括号。这样做可以避免日后修改代码时产生混乱和错误。

switch语句 

深层嵌套的 if else 语句往往在语法上是正确的,但逻辑上去却没有正确地反映程序员的意图。例如,错误的 else if 匹配很容易被忽略。添加新的条件和逻辑关系,或者对语句做其他修改,都很难保证正确。 switch 语句提供了一种更方便的方法来实现深层嵌套的 if/else 逻辑。 

使用 switch 

char ch;
// initialize counters for each vowel
int aCnt = 0, eCnt = 0, iCnt = 0,
oCnt = 0, uCnt = 0;
while (cin >> ch) {
// if ch is a vowel, increment the appropriate counter
switch (ch) {
case 'a':
++aCnt;
break;
case 'e':
++eCnt;
break;
case 'i':
++iCnt;
break;
case 'o':
++oCnt;
break;
case 'u':
++uCnt;
break;
}
}
// print results
cout << "Number of vowel a: \t" << aCnt << '\n'
<< "Number of vowel e: \t" << eCnt << '\n'
<< "Number of vowel i: \t" << iCnt << '\n'
<< "Number of vowel o: \t" << oCnt << '\n'
<< "Number of vowel u: \t" << uCnt << endl; 

通过对圆括号内表达式的值与其后列出的关键字做比较, 实现 switch 语句的功能。表达式必须产生一个整数结果, 其值与每个 case 的值比较。关键字 case 和它所关联的值称为 case 标号。每个 case 标号的值都必须是一个常量表达式。除此之外,还有一个特殊的 case 标号——default 标号。 

如果表达式与其中一个 case 标号的值匹配, 则程序将从该标号后面的第一个语句开始依次执行各个语句,直到 switch 结束或遇到 break 语句为止。如果没有发现匹配的 case 标号(并且也没有 default 标号),则程序从 switch 语句后面的第一条继续执行。在这个程序中,switch 语句是 while 循环体中唯一的语句,于是,switch 语句匹配失败后,将控制流返回给 while 循环条件。 

对于 switch 的应用,break 语句将控制跳出 switch,继续执行 switch 语句后面的第一个语句。 

switch 中的控制流 

程序从该点开始执行,并跨越 case 边界继续执行其他语句,直到 switch 结束或遇到 break 语句为止。 

有时候, 这种行为的确是正确的。程序员也许希望执行完某个特定标号的代码后,接着执行后续标号关联的语句。但更常见的是,我们只需要执行某个特定标号对应的代码。为了避免继续执行其后续 case 标号的内容,程序员必须利用 break语句清楚地告诉编译器停止执行 switch 中的语句。大多数情况下,在下一个case 标号之前的最后一条语句是 break。 

// warning: deliberately incorrect!
switch (ch) {
case 'a':
++aCnt; // oops: should have a break statement
case 'e':
++eCnt; // oops: should have a break statement
case 'i':
++iCnt; // oops: should have a break statement
case 'o':
++oCnt; // oops: should have a break statement
case 'u':
++uCnt; // oops: should have a break statement
} 

为了搞清楚该程序导致了什么结果,假设 ch 的值是 'i' 来跟踪这个版本的代码。程序从 case 'i' 后面的语句开始执行,iCnt 的值加 1。但是,程序的执行并没有在这里停止,而是越过 case 标号继续执行,同时将 oCnt 和 uCnt 的值都加了 1.如果 ch 是 'e' 的话,那么 eCnt、iCnt、oCnt 以及 uCnt 的值都会加 1。 

尽管没有严格要求在 switch 结构的最后一个标号之后指定 break 语句,但是,为了安全起见,最好在每个标号后面提供一个 break 语句,即使是最后一个标号也一样。如果以后在 switch 结构的末尾又需要添加一个新的 case 标号,则不用再在前面加 break 语句了。 

慎用 break 语句,它并不总是恰当的 

在 case 标号后省略 break 语句,允许程序向下执行多个 case 标号。这时,两个或多个 case 值由相同的动作序列来处理。由于系统限定一个 case 标号只能与一个值相关联, 于是为了指定一个范围,典型的做法是,把 case 标号依次排列。 

int vowelCnt = 0;
// ...
switch (ch)
{
// any occurrence of a,e,i,o,u increments vowelCnt
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
++vowelCnt;
break;
}
 

每个 case 标号不一定要另起一行。为了强调这些 case 标号表示的是一个要匹配的范围,可以将它们全部在一行中列出: 

switch (ch)
{
// alternative legal syntax
case 'a': case 'e': case 'i': case 'o': case 'u':
++vowelCnt;
break;
} 

比较少见的用法是,为了执行某个 case 的代码后继续执行下一个 case 的代码,故意省略 break 语句。 

default 标号 

default 标号提供了相当于 else 子句的功能。如果所有的 case 标号与switch 表达式的值都不匹配,并且 default 标号存在,则执行 default 标号后面的语句。 

哪怕没有语句要在 default 标号下执行,定义default 标号仍然是有用的。定义 default 标号是为了告诉它的读者,表明这种情况已经考虑到了,只是没什么要执行的。 

一个标号不能独立存在, 它必须位于语句之前。如果 switch 结构以 default 标号结束,而且 default 分支不需要完成任何任务,那么该标号后面必须有一个空语句。 

switch 表达式与 case 标号 

case 标号必须是整型常量表达式(第 2.7 节)。例如,下面的标号将导致编译时的错误: 

// illegal case label values
case 3.14: // noninteger
case ival: // nonconstant 

如果两个 case 标号具有相同的值,同样也会导致编译时的错误。 

switch 内部的变量定义 

对于 switch 结构,只能在它的最后一个 case 标号或 default 标号后面定义变量: 

case true:
// error: declaration precedes a case label
string file_name = get_file_name();
break;
case false:
// ... 

制定这个规则是为避免出现代码跳过变量的定义和初始化的情况。 

变量从它的定义点开始有效,直到它所在块结束为止。现在考虑如果在两个 case 标号之间定义变量会出现什么情况。该变量会在块结束之前一直存在。对于定义该变量的标号后面的其他 case 标号,它们所关联的代码都可以使用这个变量。如果 switch 从那些后续 case 标号开始执行,那么这个变量可能还未定义就要使用了。 

在这种情况下,如果需要为某个特殊的 case 定义变量,则可以引入块语句,在该块语句中定义变量,从而保证这个变量在使用前被定义和初始化。 

case true:
{
// ok: declaration statement within a statement block
string file_name = get_file_name();
// ...
}
break;
case false:
// ... 

转载于:https://www.cnblogs.com/xiaojianliu/articles/8972978.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Matlab中,布尔条件语句是一种常用的控制结构,它允许根据条件的真假来执行不同的代码块。在Matlab中,常用的布尔条件语句有if语句、if-else语句和嵌套条件语句。 1. if语句:if语句是最简单的条件语句形式,它的执行取决于一个布尔表达式的真假。如果条件为真,则执行if语句块中的代码;如果条件为假,程序将跳过if语句块,继续执行后续的代码。if语句的一般形式如下: ```matlab if 条件 % 执行if语句块中的代码 end ``` 以下是一个示例,演示了如何使用if语句判断一个数是否为正数: ```matlab num = 10; if num > 0 disp('这个数是正数'); end ``` 2. if-else语句:if-else语句在if语句的基础上增加了一个else块,用于在条件为假执行另外一段代码。if-else语句的一般形式如下: ```matlab if 条件 % 执行if语句块中的代码 else % 执行else语句块中的代码 end ``` 以下是一个示例,演示了如何使用if-else语句判断一个数是否为正数: ```matlab num = -5;if num > 0 disp('这个数是正数'); else disp('这个数不是正数'); end ``` 3. 嵌套条件语句:嵌套条件语句是指在一个条件语句中嵌套另一个条件语句。通过嵌套条件语句,我们可以实现更复杂的逻辑判断。以下是一个示例,演示了如何使用嵌套条件语句判断一个数的正负性: ```matlab num = -5; if num > 0 disp('这个数是正数'); elseif num < 0 disp('这个数是负数'); else disp('这个数是零'); end ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值