详解C++编程中的条件判断语句if-else与switch的用法
if-else 语句
控制条件分支。
语法
if ( expression ) statement1 [else statement2]
备注
如果 expression 的值不为零,执行 statement1 。如果选项 else 存在,如果 expression 的值为零,执行 statement2。 表达式必须是算术或指针类型,或者必须是定义明确的整型或指针类型转换的类类型。有关转换器的信息,请参见标准转换。
在两个形式的 if 语句和 expression 语句中计算,可以具有除结构以外的任何值,包括所有副作用。除非 statement 中的一个包含 break、 continue 或 goto,控件才能从 if 语句传递到项目中的下一条语句。
if...else 语句的 else 子句与在没有相应的 else 语句的同一范围的最接近的前面 if 语句相关。
为了使此示例可以明确有关 if...else 配对,取消对大括号的注释。
// if_else_statement.cpp #include <stdio.h> int main() { int x = 0; if (x == 0) { printf_s("x is 0!\n"); } else { printf_s("x is not 0!\n"); // this statement will not be executed } x = 1; if (x == 0) { printf_s("x is 0!\n"); // this statement will not be executed } else { printf_s("x is not 0!\n"); } return 0; }
输出:
x 是 0! x 不是 0!
switch 语句
允许根据整型表达式的值在多个代码段中进行选择。
语法
switch ( expression ) case constant-expression : statement [default : statement]
备注
expression 必须属于整型或存在到整型的明确转换的类类型。将按照整型提升中所述的方式执行整型提升。
switch 语句体由一系列 case 标签和一个可选 default 标签组成。 case 语句中的两个常量表达式的计算结果不能为同一个值。 default 标签只能出现一次。标记语句不是语法要求,但如果它们不存在,switch 语句是无意义的。默认语句无需显示在末尾;它可以显示在 switch 语句体的任何位置。case 或 default 标签只能显示在 switch 语句内。
每个 case 标签中的 constant-expression 将转换为 expression 类型,并将与 expression 比较是否等效。控制到其 case constant-expression 与 expression 的值匹配的语句的传递。下表中显示了生成的行为。
switch 语句行为
条件 | 操作 |
---|---|
转换后的值与提升的控制表达式的值匹配。转换后的值与提升的控制表达式的值匹配。 | 控制将转移到跟在该标签后面的语句。 |
没有常量与 case 标签中的常量匹配;default 标签存在。 | 控制将转移到 default 标签。 |
没有常量与 case 标签中的常量匹配;default 标签不存在。 | 控制将转移到 switch 语句之后的语句。 |
如果找到匹配的表达式,则后续 case 或 default 标签不会妨碍控制。 break 语句用于停止执行并将控制转移到 switch 语句之后的语句。如果没有 break 语句,则将执行从匹配的 case 标签到 switch 末尾的每个语句,包括 default。例如:
// switch_statement1.cpp #include <stdio.h> int main() { char *buffer = "Any character stream"; int capa, lettera, nota; char c; capa = lettera = nota = 0; while ( c = *buffer++ ) // Walks buffer until NULL { switch ( c ) { case 'A': capa++; break; case 'a': lettera++; break; default: nota++; } } printf_s( "\nUppercase a: %d\nLowercase a: %d\nTotal: %d\n", capa, lettera, (capa + lettera + nota) ); }
在上面的示例中,如果 c 是大写 A,则 capa 将递增。 capa++ 之后的 break 语句会终止 switch 语句体的执行并将控制转移到 while 循环。如果没有 break 语句,lettera 和 nota 也将递增。 case 'a' 的 break 语句也能达到类似的目的。如果 c 是小写 a,则 lettera 将递增,并且 break 语句将终止 switch 语句体。如果 c 不是 a 或 A,则将执行 default 语句。
switch 语句的内部块可以包含带有初始化的定义,前提是可以访问到它们 - 即,所有可能的执行路径都不会绕过它们。使用这些声明引入的名称具有局部范围。例如:
// switch_statement2.cpp // C2360 expected #include <iostream> using namespace std; int main(int argc, char *argv[]) { switch( tolower( *argv[1] ) ) { // Error. Unreachable declaration. char szChEntered[] = "Character entered was: "; case 'a' : { // Declaration of szChEntered OK. Local scope. char szChEntered[] = "Character entered was: "; cout << szChEntered << "a\n"; } break; case 'b' : // Value of szChEntered undefined. cout << szChEntered << "b\n"; break; default: // Value of szChEntered undefined. cout << szChEntered << "neither a nor b\n"; break; } }
switch 语句可以嵌套。在这种情况下,case 或 default 标签将与封装它们的最近的 switch 语句关联。
相关文章
- vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
- 这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
- 整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
MyBatisPlus-QueryWrapper多条件查询及修改方式
这篇文章主要介绍了MyBatisPlus-QueryWrapper多条件查询及修改方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2022-06-27- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
- 这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
- 这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
- 这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15
- 这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章是对C++中的常见编译错误进行了详细的分析介绍,需要的朋友参考下...2020-04-25