规范化的C++编程方法备忘录 C/C++算数运算:

    已经知道的,不说了...大家都知道的,可以问问,查查资料。这里又放些附加建议:
1.基本算数运算:
  既然计算机里没有真正的整数,那么计算机里也没有真正的算数运算。
    取值范围:
  设a和b是两个占一样位宽的无符号整数,这种整数可取到最大值MAX:
    如果f1为一元运算,f2为二元运算,则先将计算机中的整数和运算扩展到 {0}UZ+ 域

      f1(a) = fz1(az) % MAXz,
         f2(a, b) = fz2(az, bz) % MAXz.
      其中MAXz=R(MAX) + 1.
    这些东西计算机系的应该知道的啦。即“有溢出可能的运算”或有穷域的取值问题

还有隐式转换、强制类型转换等。因为可查,略过。
    书写代码时很多书里建议......(这里主要谈括号的问题)。对于默认顺序,个人认为有些建议没有必要:
已知的先乘除,后加减;先算数,后逻辑。初中、高中的东西。很多建议将算数加括号,多此一举。自己该补课去。但如果代码很长那就是另外一回事了。还有,位运算一定要加括号。因为它们不是基本代数运算。
    加、乘、与、或运算也不满足交换率(尤其是对其他线程数据的读写运算)。
    如果某一小块代码区域集中了大量的代数运算,而上面这类问题对结果有很大影响,建议用类将整数包装一下(但不要太复杂,影响性能),以便能正确地处理进位截断问题。
    如果表达式中有超过一处使用同一变量,该变量是同时被多个线程存储的,要用本地临时变量拷贝取代表达式里所有的那个变量,以避免计算出莫名其妙的值。记住不要依赖编译器优化机制的隐含修改。
2.比较运算:
 - 比较符号的左右两边数据类型必须相同。如果不同,代码照常编译通过。但是数据类型一定是相等的,只是通过了隐式转换,这种转换有时会让你晕倒...
正确的代码

引用:
WORD a, b, c

...
if((WORD)(a+b) >= c)  // Never thought that '(WORD)()' be unnecessary.
...

 - 比较必须完整,不然会留下隐患
正确的代码

引用:
unsinged int a, b, c

...
if(a > c - b || b > c)  // We need 'if(a+b>c)' actually.
...

 - 比较中尤其要考虑进位截断问题
例子同上。注意那个a+b>c为什么要用a>c-b表示而不直接写
 - 注意指针指向对象对比较的影响,因为指针有可能为空
正确的代码

引用:
if(p == NULL)
{
 ...
}
else if(*p >= n)
{
 ...
}
else
{
 ...
}

不要写成

引用:
if(p != NULL && *p >= n)
{
 ...
}
else
{
 ...
}

因为这样的代码执行顺序受编译器及其优化影响很大,顺序不当,引发访问空指针异常。
 - 注意多线程对比较的影响
正确的代码

引用:
int volatile a;  // It will be written by another thread.

switch(a)
{
case 0:;
 ...
  break;
case 1:;
 ...
  break;
default;
}

不等同于(下面的代码先不考虑效率问题)

引用:
if(a == 0)
{
 ...
}
else if(a == 1)
{
 ...
}
else
{
 ...
}

应该建立一个本地临时变量,将a拷贝,然后用那个本地临时变量完成比较。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

unituniverse2

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值