一.switch-case

switch-case语句主要用在多分支条件的环境中,在这种环境中使用if语句会存在烦琐且效率不高的弊端。

switch(expression)

{

  case const expression1:

    ....

  case const expression2;

    ...

  default:

    ...

}

在执行过程中,expression的值会与每个case的值比较,实现switch语句的功能。关键字case和它所关联的值被称作case标号。每个case标号的值都必须是一个整形常量表达式且不能存在两个case标号相同的情形。除此之外,还有一个特殊的case标号-default标号。

如果expression的值与其中一个case标号相匹配,则程序将从该标号后面的第一个语句开始执行各个语句,直到switch结束或者遇到break语句为止,如果没有发生与之匹配的case标号(并且也没有default标号),则程序会从switch语句后面的一条语句继续执行。

关于switch一般存在这样的误解:以为程序只会执行匹配的case标号相关的语句。实际上并非如此,该标号只是程序会执行的起始点,程序会从该点执行,并跨越case边界继续执行其他语句,直到switch结束或遇到break语句为止。

break语句的使用,是switch-case语句的核心。因为在大多数情况下,在下一个case标号前面必须加上一个break语句。

故意省略break是一种特别罕见的用法,因此在这种形式的代码附近,请务必添加一些注释,说明其运行逻辑。

在switch-case结构中,只能在最后一个case标号或default中定义内部变量。指定这种规则是为了避免出现代码跳过变量定义和初始化的情况。

这个规则存在的原因:一般如果定义一个变量,此变量便从此定义开始有效,直到所在的语句块结束。如果在两个case中间定义一个变量,那么对于定义变量的case标号后面的其他标号都可以使用这个变量。但是如果switch从那些后续case标号开始执行呢?可能这个变量没有定义就使用了,这是我们所不想看到的。为了实现在case中可以定义变量,可以引进语句块思想实现。在该语句块中定义变量,从而保证这个变量在使用前定义和初始化。而出了这个语句块该变量就是非法了。所以,在case语句块中,最好不要定义变量,所需的变量应在switch之前进行定义和初始化。如果必须定义变量,请谨慎而为,请采用语句块方式实现内部变量的定义。

对于那些哪怕没有语句在default标号下执行的环境中,定义default标号依然是有用的,定义default标号可明确地告诉读者,这种情况已考虑到,只是没有什么可以执行的。default标号不能单独存在,它必须位于语句之前,如果switch以default结束,而default分支没有什么任务需要执行,那么default标号后面必须添加 个空语句。

二.&&,||

&&和||是C++逻辑或和逻辑与操作符。在求值过程中,仅当a不能确定表达式的值时,才会求解b。在逻辑与表达式中,a的计算结果是true。如果a的计算结果是false,则无论b的值是什么,逻辑表达式的值都为false。当a的值为true时,只有b的值也为true时,逻辑与表达式的值才为true。在逻辑或中同样,这就是短路求值。

&&和&,||和|的区别:&和|是位与和位或操作符。需要两个整型操作数。&,在每个位的位置,如果两个操作数对应的位都为1,则操作结果中该位为1,否则为0。|操作,在每个位的位置,如果两个操作数对应的位只有一个为1,则操作结果中该位为1,否则为0;位操作符和逻辑操作符的每一个区别是||和&&操作符具有短路性质,如果表达式的值根据左操作数就可以决定,则它就不再对右操作数进行求值。与之相反,|和&操作符两边的操作数都需要进行求值。

在C++中,;标示一条语句的结束。如果不小心多写了一个分号,可能不会造成什么不良的后果。这个分号可能会被当做一个不会产生任何效应的空语句;或者这个多余的分号被编译器识别,编译器会因为这个多余的分号产生一条警告语句,根据这个警告语句你可以很快找到并去掉它。但在if,for,while语句之后多加了一个分号,那么原来紧跟在if或者while子句之后的语句与条件判断部分就没有任何关系了。例如

int a = 1;

while(a == 1);

{

  a--;

}

正常编译,且循环

同样少了分号也会带来错误,例如

int arrIntMatrix[3] = {0,1,3}

void main()

{

  int iIndex = 3;

  if(iIndex<3)

  return

  arrIntMaxtrix[0] = 3;

}

分号标示C++语句结束,多了一个分号和少了一个分号都可能造成不良后果。应小心谨慎。

三.条件运算符和逗号运算符

条件运算符是C++语言唯一的"三目运算符"。其接受3个操作数,同样条件的操作符会控制表达式的求值顺序。用法如下:

expression1?expression2:expression3;       (1)

(expression1)?(expression2):(expression3);   (2)

条件运算符的优先级非常低,所以它的各操作数即使不加括号,一般也不会产生问题。但是为了表达的清楚性,还是倾向于在各个表达式两端加上括号。首先计算expression1,如果值为真,那么整个表达式的值就是expression2的值,而expression3不会进行求值。否则,如果expression1的值为假,那么整个条件语句的值就是expression3的值,而expression2不会进行求值。

逗号操作符将两个或多个表达式分隔开来,这些表达式自左向右逐个进行求值,而整个表达式的值是最后那个表达式的值。用法如下:

expression1,expression2,expression3,...,expressionn;

逗号操作符中的每个表达式会被求值,而整个表达式的值却是最后一个表达式的值。因为这些表达式的求值顺序已经固定,即采用从左到右的求值顺序。常用在for语句的增量部分,即如果迭代变量不止一个的话,它就派上用场了, for(int i = 0,j=MAX;i<=j;++i,--j)

四.循环语句

不可在for循环全内修改循环变量,防止for循环失去控制,最终导致死循环等奇怪现象

建议for语句的循环控制变量的取值采用"半开半闭区间"写法,因为这种写法更加直观。

x值属于半开半闭区间"0<=x<N",起点到终点的间隔为N,循环次数为N      x值属于闭区间"0<=x<=N-1",起点到终点的间隔为N-1,循环次数为N

for(int x=0;x<N;x++)                          for(int x=0;x<=N-1;x++)      //代码1更加直观

在C/C++循环语句中,for语句使用的频率最高,while语句次之,do..while语句很少用。

在多重循环中,如果有可能,应将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。原因如下:最长循环放到内部可以提高I cache的效率,降低因为循环跳转造成cache的miss以及流水线flush造成的延时,多次相同循环后也能提高跳转预测的成功率,提高流水线效率。

示例1:for(row = 0;row<100;row++)            示例2:for(row = 0;row<100;row++)

  for(col=0;col<5;col++)                 for(col=0;col<5;col++)

  {                            {

    sum = sum+a[row][col];                sum = sum+a[row][col];

  }                            }

示例1低效率,长循环在最外层,示例2高效率,长循环在最内层

如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。

示例3:for(i = 0;i<100;i++)            示例4:if(condition)

  {                           {

    if(condition)                     for(i = 0;i<100;i++) 

      DoSomething();                  DoSomething();

    else                        }else

      DoOtherthing();                {

  }                             for(i = 0;i<100;i++)

                                  DoSomething();

                              }

示例3的程序比示例4多执行了N-1次逻辑判断。并且由于前者总要进行逻辑判断,打断了循环"流水线"作业,使得编译器不能对循环进行做优化处理,降低了效率。如果N非常大,最好采用示例4的写法,可以提高效率。如果N非常小,两者效率差别并不明显,采用示例3的写法比较好。因为程序更加简洁。

switch_case,&&,||,条件操作符和逗号操作符,循环语句的更多相关文章

  1. JavaScript 逗号操作符

    让我们从一个有趣的微博开始吧. 末尾的c是优先级最低的逗号操作符.逗号操作符是操作符优先级的最后一行,并且很少有文章记录,它隐藏着它的锋芒.它可能不是JavaScript强势操作符,但是我喜欢它.它简 ...

  2. js-条件语句、循环语句

    一. 常见条件语句 if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if... ...

  3. Java中的循环语句

    1.1 while 循环语句 while 语句也称为条件判断语句. 循环方式 : 利用一个条件来控制是否要反复执行这个语句. 语法 : while(条件表达式){ 执行语句 } 当条件表达式的返回值为 ...

  4. python操作符及其循环语句(非常全)

    //2018.10.14 1. Windows + R可以直接进行运行cmd 2. Random.randint(a,b):产生a-b的任意一个整数,在IDLE里面运行时需要注意在前面写好调用impo ...

  5. (数据科学学习手札02)Python与R在循环语句与条件语句上的异同

    循环是任何一种编程语言的基本设置,是进行批量操作的基础,而条件语句是进行分支运算的基础,Python与R有着各自不同的循环语句与条件语句语法,也存在着一些相同的地方. Python 1.for循环 ' ...

  6. linux条件测试操作(test)和if判断语句,while循环语句,break控制语句和for循环和case多分枝语句和select语句

    条件测试操作 条件测试是专为影响"$?"的操作,是条件转移.循环语句的基础   test测试命令: test 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0, ...

  7. javascript语句——条件语句、循环语句和跳转语句

    × 目录 [1]条件语句 [2]循环语句 [3]跳转语句 前面的话 默认情况下,javascript解释器依照语句的编写顺序依次执行.而javascript中的很多语句可以改变语句的默认执行顺序.本文 ...

  8. ISO/IEC 9899:2011 条款6.5.17——逗号操作符

    6.5.17 逗号操作符 语法 1.expression: assignment-expression expression    ,    assignment-expression 语义 2.一个 ...

  9. js之语句(条件语句,循环语句,跳转语句)

    一.条件语句 1.if语句 条件语句是通过判断指定表达式的值来决定执行还是跳过某些语句,这些语句是代码是“决策点”有时称之为“分支”. if语句是一种基本的控制语句,它让Javascript程序可以选 ...

随机推荐

  1. visibleViewController和topViewController 获取当前显示的页面

    原文:http://blog.sina.com.cn/s/blog_881ed8500102vo38.html UINavigationController 中有visibleViewControll ...

  2. Matlab定义子函数

    上篇博客介绍了在Matlab中自己定义简单函数的方法,本篇博客将介绍定义子函数的方法.本文承接上篇博客的样例,即随机生成一个3行4列的矩阵,矩阵中的元素设定上下限为(low,high).并返回矩阵全部 ...

  3. CodeSmith exclude global 文件和文件夹问题 与 输入中文显示乱码问题

    1.打开C:/Documents and Settings/你的用户名/Application Data/CodeSmith/v4.1/CodeSmithGui.config文件. 2.在<te ...

  4. asp.net 使用HttpModule记录全局错误

    以前使用Global.asax记录全局的错误日志觉得挺好用,但是如果一个解决方案下有N多个项目,每个下边都需要加一个并且代码都还是重复的,终于有一天无法再忍受这种模式,考虑到HttpModule,直接 ...

  5. 无法识别的属性“targetFramework”

    问题描述:无法识别的属性“targetFramework”.请注意属性名称区分大小写. 解决办法:修改.NET Framework 版本为相应版本即可,例如2.0换成4.0. 参考:http://bl ...

  6. WindowsService服务的C#实现

    WindowsService(简称服务,下同)是目前做客户端软件后台运行功能的非常好的选择,本文基本解决了服务的创建和编写,代码控制服务的安装.卸载.启动.停止等,为服务传递参数,其他注意事项等 1. ...

  7. Spring-----多环境中加载资源配置文件

    转载自:http://blog.csdn.net/hekewangzi/article/details/51942128

  8. 浅谈C中的指针和数组(三)

    上一个博客我们得到了一个结论: 指针和数组根本就是两个完全不一样的东西.只是它们都可以“以指针形式”或“以下标形式”进行访问.一个是完全的匿名访问,一个是典型的具名+匿名访问.一定要注意的是这个“以X ...

  9. poco vs Boost[ZZ]

    http://wooce.iteye.com/blog/634395 POCO的优点: 1) 比boost更好的线程库,特别是一个活动的方法的实现,并且还可设置线程的优先级. 2) 比 boost:a ...

  10. CentOS6安装Mysql5.7.10亲测

    亲测验证适用于5.7.10 1. 获得二进制文件 wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.10-linux-glibc2.5-x8 ...