一.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. CodeFirst EF中导航属性的个人理解

    >导航属性: 01.个人理解就是Ef中的属性在实体数据表中不存在(先这么认为); 02.就是除了根据表中列映射出的属性 之外根据表与表之间的关系的关联属性.方便操作与之关联的表; 例如: 有 表 ...

  2. Android API Level在11前后及16之后时Notification的不同用法

    作为刚入门Android的小白,最近在按照郭大神的<第一行代码>在练习,在用到Notification时遇到了一些问题,网上资料比较零散,我这里做了一个总结分析给各位,若有错误,恳请指正~ ...

  3. sql server 存储过程、事务,增删改

    CREATE procedure [dbo].[sp_TableSave] @TypeID tinyint, -- 0 新增,1 修改,2 删除 @ID int, ), ), ), @UID int, ...

  4. @synthesize 与@dynamic区别

    @synthesize 除非开发人员已经做了,否则由编译器自动生成getter/setter方法. 当开发人员自定义存或取方法时,自定义会屏蔽自动生成该方法. @dynamic 告诉编译器,不自动生成 ...

  5. cocos2dx3.3在Windows环境搭建以及新工程创建

    这个虽然比较简单,但是是学习cocos的第一步,不积跬步无以至千里,所以今天先分享Windows下环境搭建问题.关于mac搭建后续有机会在写(ps:因为我暂时没有mac),anyway,开始吧! 首先 ...

  6. OpenCV学习(1) RGB颜色空间

    1.1彩色空间 颜色是外来的光刺激作用于人的视觉器官而产生的主观感觉,它具有色调.饱和度和亮度三个特性.物体的颜色不仅取决于物体本身,还与光源.周围环境的颜色,以及观察者的视觉系统有关 1.1.1颜色 ...

  7. [转载]CTreeCtrl 和 CListCtrl 控件(VC_MFC)

    来源:http://www.cnblogs.com/kzloser/archive/2012/11/23/2783305.html Tree Control 控件(MSDN 链接) 说明: 树形控件是 ...

  8. JavaWeb核心编程之(三.4)Servlet Context 配置

    ServletContextServlet引擎为每个Web应用程序都创建一个对应的ServletContext对象, ServletContext对象被包含在ServletConfig对象中, 调用S ...

  9. 向mysql添加新用户并分配权限

    首先要声明一点,大部分情况下,修改MySQL是需要有mysql里的root权限的,所以一般用户无法更改密码,除非请求管理员. 方法一使用phpmyadmin,这是最简单的了,修改mysql库的user ...

  10. 线程间使用socket通信的计算器

    该程序是处理平时的算数运算,程序也没有什么特别之处,只是将所有运算分开运算,每个函数(线程)处理不同的运算符号里面的运算,然后将所有结果都汇总到main函数中进行最后汇总(相加减)运算,每个函数内都处 ...