栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

C和指针阅读第四天

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C和指针阅读第四天

操作符和表达式
  • 操作符
    • 算数运算符
    • 位移操作符
    • 位操作符
  • 布尔值
  • 表达式求值
    • 隐式类型转化
    • 算术转换

     C提供了所有你希望编程语言应该拥有的操作符,它甚至提供了一些你意象不到的操作符。事实上,C被许多人所诟病的一个确定就是它品种繁多的操作符。C语言这个特点使它很难精通。另外一个方面,C的许多操作符具有其他语言的操作符无可抗衡的价值,这也是C适用于开发范围极广的应用程序的原因之一。

操作符

     

算数运算符

     C提供了所有常用的算术操作符:

+ - * / %

     除了%操作符,其余几个操作符都是即使用浮点类型又使用整数类型。当/操作符的两个操作数都是整数时,它执行整除运算,在其他情况下则执行浮点数除法。%为取模操作符,它接受两个整型操作数,把左操作数除以又操作数,但它返回的值是余数而不是商。

     

位移操作符

     汇编语言程序员对位移操作已经是非常熟悉了。对于那些适应能力强的读者,这里作一个简单介绍。位移操作只是简单把一个值的位向左或右移动。在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则被0补齐。而右移操作存在一个左移操作不曾面临的问题:从左边移入新位时,可以选择两种方案。一种是逻辑位移,左边移入的位用0填充;另外一种是算术位移,左边移入的位由原先该值的符号位决定。如果值10010110右移两位,逻辑位移的结果是00100101,但是算符运算的结果是11100101。算术左移和逻辑左移是相同的,他们只在右移时不同,而且只有在当操作数时负值时才不一样。
      注意:标准说明无符号值执行的所有位移操作都是逻辑位移,但对于右符号值,到底是采用逻辑位移还是算术位移取决于编译器。
      下面的程序使用右移位操作来计数一个值中值为1的位的个数。它接受一个无符号参数(这是为了避免右移位的歧义),并使用%操作符判断最右边的一位是否非零。

int 
count_one_bits(unsigned value)
{
int ones;


for(ones = 0;value != 0;value = value >> 1)
//如果最低位值为1,计数增加1
if(value % 2 != 0)
ones = ones + 1;
return ones;

     

位操作符

     位操作符对它们的操作数的各位执行AND、OR和XOR(异或)等逻辑操作。当两个位进行AND操作时,如果两个位都是1,结果为1。否则结果为0.当两个位进行OR操作时,如果两个位都为0,结果为0。否则结果为1。最后,当两个位进行XOR操作时,如果两个位不同,结果为1,如果两个位相同,结果为0。这些操作以图表的形式总结如下:
     
下面的表达式显示了你可以怎样使用位移操作符和为操作符来操纵一个整型值中的单个位。表达式假定变量bit_number为一整数值,它的范围是从0至整型值的位数 -1,并且整型值的为从右向左计数。第1个列子把指定的位设置为1;

value = value | 1 << bit_number;

     
下面一个列子把指定位请0

value = value & ~ (1 << bit_number);

     
这些表达式常常写成| = 和 &= 操作符的形式。下面的表达式对指定位进行测试,如果该位已经设置为1,则表达式的结果为非零值。

value & 1 << bit_number;

     

布尔值

     
     C并不具备显示的布尔值,所以使用整数来代替。其规则是:

零是假,任何非零值皆为真

然而,标准并没有说1这个值比其他任何非零值”更真“ !!!

表达式求值

     表达式求值顺序一部分式由它所包含的操作符的优先级和结合性确定。同样,有些表达式的操作数在求值过程中可能需要转换为其他类型。

隐式类型转化

C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符型和短整型操作数在使用之前被转化为普通整型,这种转化称为整型提升。
列如:

char a,b,c
a = b + c;

b和c 的值被提升为普通整型,然后再执行加法运算。加法运算的结果将被接短,然后存储于a中。这个列子的结果和使用8位算术的结果是一样的。但在下面的这列子中,它的结果就不再相同。这个列子用于计算一系列字符的简单校验和

a = (~ a ^ b << 1) >> 1;

由于存在求补和左移操作,所有8位精度是不够的。标准要求进行完整的整型求值,所以对于这类表达式的结果,不会存在歧义性。

     

算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数转换另外一个操作数类型,否则操作就无法进行。下面的层次体系称为寻常算术转化:

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1038549.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号