邯郸营销网站建设公司,关闭wordpress评论,移动互联网以什么为技术核心,大什么的网站建设公司好你好#xff0c;C#xff08;18#xff09; 到底要不要买这个西瓜#xff1f;4.1.6 操作符之间的优先顺序
4.1.6 操作符之间的优先顺序
在表达一些比较复杂的条件判断时#xff0c;在同一个表达式中#xff0c;有时可能会存在多个操作符。比如#xff0c;我们在判断要…你好C18 到底要不要买这个西瓜4.1.6 操作符之间的优先顺序
4.1.6 操作符之间的优先顺序
在表达一些比较复杂的条件判断时在同一个表达式中有时可能会存在多个操作符。比如我们在判断要不要买某个西瓜时不仅要 判断它的总价单价8.2元/斤一共10.3斤是否小于100块钱因为兜里只有这么多钱同时还要判断这个西瓜是否有坏掉的地方。要表达这个复杂 的条件判断我们不得不把前面学过的算术操作符、关系操作符和逻辑操作符全都派上场 bool bBad false; // 是否有坏掉的地方
float fPrice 8.2; // 单价
float fWeight 10.3; // 重量
// 判断总价是否小于100且是否坏掉
if(fPrice * fWeight 100 !bBad)
{cout买西瓜endl;
}
else
{cout算了不买了endl;
} 在“fPrice * fWeight 100 !bBad”这个表达式中有算术操作符“*”有关系操作符“”同时也还有逻辑操作符“!”和“”。那么这么多操作符 在同一个表达式中到底该从哪一个操作开始呢这个表达式的最终结果又是什么呢
要想搞清楚一个表达式是按照什么顺序计算的就得先搞清楚各个操作符之间的计算优先级。按照正确的计算顺序进行计算才可以得出正确的结果。在C中各个操作符的优先级如表4-1所示。
表4-1 操作符的优先级 级别
操 作 符
说 明
1
( )
括号是所有操作符中的领导具有最高的优先级。如果括号内部还有括号内部括号的优先级更高
2
、(正号)、-(负号)、、--
它们都是一元操作符往往是对操作数进行计算得到结果后继续参与下一个计算
注意这里的、-指的是改变数值正负属性的符号而不是加减操作的符号
3
*、/、%
乘、除、取余运算
4
、-
加、减运算
5
、、、、、!
关系运算
6 逻辑与运算它会首先计算其左侧表达式的值当其值为true时才会继续计算右侧表达式的值最后计算两个值的逻辑与
7
||
逻辑或运算它同样会首先计算其左侧表达式的值若其值为false则继续计算右侧表达式的值最后计算两个值的逻辑或
8
、、*、/、%
赋值操作 表达式的计算顺序规则是总是优先计算优先级较高的操作符同一优先级的操作符则按照从左到右的顺序进行计算如果有特殊规 则的操作符比如逻辑与“”则按照特殊规则进行计算。在清楚了各操作符的优先级及表达式的计算规则后那就可以计算上面这个复杂 表达式的结果了。在这个表达式中有一个拥有特殊规则的操作符“”按照它的计算规则这个表达式会首先计算其左侧表达式的值 fPrice * fWeight 100 // 首先得到计算的左侧表达式
在这个表达式中没有特殊规则的操作符那就按照操作符的优先级进行计算。其中优先级最高的是计算总价的乘法算术操作符“*”对其进行计算后得到一个中间结果 84.46 100 // fPrice*fWeight的结果是84.46
这个中间结果表达式只有一个操作符直接计算得到其结果值为true。按照“”操作符的计算规则如果左侧表达式的值为true则继续计算其右侧表达式的值。所以接下来要计算的表达式变为 true !bBad // 左侧表达式计算完成后的中间结果
在“”的右侧只有一个操作符“!”直接计算得到的中间结果是 true true
现在剩下唯一的逻辑与操作符“”最终结果一目了然对两个true值进行逻辑与运算表达式的最终结果是true。计算机 在对表达式进行计算时是按照各个操作符的优先级确定的计算顺序进行的。反过来这也就要求我们在设计表达式的时候也同样必须遵守操作符的优先顺序按 照这个顺序来设计表达式。否则实际的计算顺序跟我们设想的计算顺序不同得到的计算结果自然也就跟我们的设想大相径庭了。从这个意义上讲熟悉和掌握操 作符的优先级十分必要。 最佳实践合理使用括号标示表达式的计算顺序 从上面这个例子我们可以看到过于复杂的表达式计算起来非常麻烦。虽然表达式是由计算机负责计算我们不用担心计算机怕麻烦。但是表达式却是由程 序员进行设计并且也是要提供给他人阅读的。设计过于复杂的表达式很容易出错且代码的可读性非常差。所以我们应当尽量避免在同一表达式中混合使用多个操 作符尽量保持表达式的短小精悍。必要的时候可以将复杂的表达式拆分成多个较小的表达式分别计算得到中间结果最后再将中间结果组合起来得到最终结果。 例如我们可以把上面的复杂表达式拆分成两个较小的表达式分别判断是否有坏掉的地方以及总价是否小于100块然后再将这两个中间结果进行“与”运算 得到最终结果 // 将复杂表达式拆分成两个较小的表达式
bool bFresh !bBad; // 表示是否新鲜
float fTotal fPrice * fWeight; // 计算总价
bool bMoney fTotal 100; // 判断总价是否小于100块
// 对中间结果进行比较
if( bFresh bMoney)
// … 经过这样的拆分每个表达式的计算都清楚明了减少了出错的可能可读性也得到了提升。但是它同时也带来一个不便之处那就是代码变的过于繁琐。既想得到拆分表达式带来的清楚明了的好处又想避免代码繁琐的不便那就只有使用“()”了。 “()”的优先级是所有操作符中最高的使用它可以人为地按照设计者的意图标示表达式中的计算顺序。比如可以改写上面的表达式用括号来表达我们希望的计算顺序让其表达的意义更加清晰 // …
if(((fPrice * fWeight) 100) (!bBad))
// …
使用括号后整个表达式的计算顺序变得一目了然按照括号确定的计算顺序首先计算最里层的(fPrice * fWeight) 得到中间结果84.46然后计算(84.46 100)得到中间结果true接着计算(!bBad)得到中间结果true最后计算“true true”得到最终结果true。使用括号后计算顺序跟默认顺序相同但是却增加了代码的可读性让我们对计算顺序一目了然同时也避免了让代码变得过 于繁琐。另外在某些特殊情况下需要改变表达式的默认计算顺序时括号成为一种必须。 总结起来使用“()”后我们想让表达式按照什么顺序计算就按照什么顺序计算妈妈再也不用担心我记不住各个操作符的优先级。 4.1.7 将表达式组织成语句
学习C编程实际上也就是学习如何使用这门特殊的语言来描述和表达现实世界就如同我们学习英语是为了用它来描述和表达现 实世界一样。在前面的章节中我们学习了操作符学习了由操作符连接操作数而构成的各种表达式而这些只能算是这门语言中的“短语”它们可以表达一定的 意义但却是不完整的 // 短语式的表达式
a // 一个单独的变量什么都不做
3 2 // 用算术操作符“”计算3和2的和
这些表达式可以被执行但它们并不改变程序的状态也没有计算结果保留下来所以没有任何实际的意义。就像在英语中我们需要给短语加上主谓宾才能构 成一个完整的句子一样在C中我们也同样需要把一些表达零散意义的表达式组合起来最后再加一个英文分号表示结束以此来形成一个语句用以完成某 个相对独立而完整的功能。例如把上面两个表达式通过赋值操作符组合起来就形成了一条完整的赋值语句 // 赋值语句
a 3 2;
形成语句后它表达了一个完整的意义用算术操作符“”计算3和2的和然后将其赋值给变量a。
在C中语句和表达式并没有严格的区分。很多时候一个表达式加上一个分号就可以直接形成一条语句。语句强调它所完成的功能而表达式关注它所描述的运算和最终的结果。在此之前我们已经接触过两种最常见的语句类型变量定义语句和赋值语句。 知道更多使用“{}”表示的语句块 当连续的多条语句属于同一个控制结构时可以用一对花括号“{}”将这些语句括起来从而形成一个语句块共同表达一个相对独立的意义。在使用上 语句块与单独的语句并无太大区别但是它的意义在于它可以将多条语句打包成一个语句块从而可以在for循环等控制结构中执行多条语句。例如在for 循环结构中我们可以这样来统计从1到100间所有整数的和 int nTotal 0;for(int i 1; i 100; i)nTotal i;
这个统计只需要一条语句就可以完成自然可以把这条语句直接放在for循环结构之后完成可是如果我们只需要统计这个区间中所有偶数的和那么就需 要加上条件判断这就不是单独一条语句可以完成的了。我们必须用“{}”将所有判断偶数、统计偶数的语句打包成一个语句块然后放在for循环结构之后才 能完成统计 for(int i 1; i 100; i){ // for循环语句块开始if(0 i%2) // 判断语句nTotal i; // 统计语句
} // for循环语句块结束
除了打包语句之外语句块的另外一个意义是它代表了C中的作用域的起讫位置。关于作用域的具体介绍可以参考后继的7.3.3小节。