2.3.8 其他运算符
一下学了这么多的运算符,是不是 C 语言的运算符都学完了呢?没有!不过剩下的也不太多了,而且部分运算符会留到后面的章节中再讲。下面再来讲几个比较常用的运算符。
1.类型转换运算符“( )”
在讲算术运算符的时候说过,如果左右两个操作数类型不同,那么相对较小的数据类型会自动地转换成较大的数据类型,然后再进行运算,这种自动将小类型转换为大类型的行为就属于隐式类型转换。那么现在要讲的这个类型转换运算符就属于显式的类型转换,它不但可以像隐式类型转换一样将一个小类型转换为大类型,而且也可以将一个大类型转换为一个小类型,这是隐式类型转换做不了的,所以它的功能更强大。类型转换运算符的使用方式如下:
( 数据类型 ) 操作数
其中“( )”为类型转换运算符,小括号内的数据类型表示要转换的目的数据类型,即在操作数的基础上,得到一个目的数据类型的值作为结果返回。例如:
double d = 3.14; //定义一个双精度浮点数类型变量 d,其初始值为 3.14 int a = (int)d; //对变量 d 进行类型转换,得到整型值 3 作为整型变量 a 的初始值
这个例子中,变量 d 是 double 类型的,其值为 3.14,通过类型转换运算符将其进行转换,得到一个整型新值 3(抛弃了小数部分),并把它赋给整型变量 a。需要注意的是,类型转换运算符不是带副作用的运算符,所以它的操作数(变量 d)并不会被修改,它仍然是 double 类型的,值也依然是 3.14。
此外,在 C 语言中小括号“( )”并非都是作为类型转换运算符来使用的,例如下面的逗号运算符例子中,会将小括号用于一个赋值表达式中,从而起到提升优先级的作用。
2.逗号运算符
逗号也是个运算符?没错!但不是 C 语言中所有的逗号都是运算符,例如前面在定义变量的时候可以使用逗号:
int a, b, c;
这里定义了三个整型变量,每个变量名之间用逗号隔开。这儿的逗号就不是运算符,它只是个分隔符。其实不只是这里,在很多时候逗号也不算为运算符。例如在函数的参数列表中也会用逗号来分隔各个参数;在为数组初始化的时候,也会在初始值列表里用逗号来分隔各个值。关于函数与数组我们会在后面讲到。
那什么情况下逗号才是运算符呢?我们先来看看逗号运算符的使用方式:
操作数 1, 操作数 2, 操作数 3, …
像这样位于多个操作数间的逗号,就是逗号运算符,是不是很简单?那逗号运算符有什么作用呢?其实也很简单,既然是运算符,就会有运算的结果,逗号运算符的运算结果就是最后一个操作数的值。例如:
int a; a = (3, 4, 5);
上面的小括号内共有 3 个操作数,操作数之间的逗号就是逗号运算符。由于最后一个操作数的值是 5,所以逗号运算符的运算结果就是 5,也就是最终会把 5 赋值给整型变量 a。需要注意的是,这儿的小括号不是类型转换的意思,而是为了提升小括号内逗号表达式的优先级,因为逗号运算符的优先级比赋值运算符的优先级低(逗号运算符是 C 语言所有运算符中优先级最低的),所以若没有小括号,就会把“a = 3”作为第一个操作数来使用了,而逗号运算符的运算结果 5 被抛弃,最终变量 a 的值为 3。
3.条件运算符
C 语言中唯一的三目运算符出场啦!它就是条件运算符,符号为“?:”,一个英文的问号和一个英文的冒号。它的使用方式如下:
操作数 1 ? 操作数 2 : 操作数 3
三个操作数被问号和冒号所分隔,那这个条件运算符的运算结果是什么呢?有两种情况:①若操作数 1 为真(非零值),则将操作数 2 的值作为运算结果;②若操作数 1 为假(零值),则将操作数 3 的值作为运算结果。也就是根据操作数 1 是真是假这个条件,来决定结果是操作数 2 还是操作数 3,二者中必选其一。例如:
int a, b; a = 1 ? 10 : 100; //条件运算符的结果为操作数 2 的值 b = 0 ? 10 : 100; //条件运算符的结果为操作数 3 的值
由于 1 为真,所以变量 a 的值被赋为操作数 2 的值 10;而 0 表示假,所以变量 b 的值为操作数 3 的值 100。
4.sizeof 运算符
前面所学的运算符都是由符号构成的,而 sizeof 运算符是 C 语言中唯一一个由字母构成的运算符。它的作用是获取操作数的大小。这个操作数可以是一种数据类型,也可以是某种数据类型的常量或变量。它的使用方式是:
sizeof (操作数);
在小括号中放入一个操作数,sizeof 运算符就可以返回它的大小,以字节为单位。通过 sizeof 运算符就可以很方便地获知某种数据类型在内存中所占用的空间大小。例如:
sizeof 运算符是不是很厉害啊?另外,还有一个小窍门:若操作数是一种数据类型,那么必须使用小括号,如果操作数并非是数据类型的话,就可以省略小括号,像下面这样来使用:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论