其他运算符、优先级和结合性

三目运算符

三目运算符可以携带一个条件表达式,根据条件表达式的值确定该三目运算符表达式的值。

运算符作用
? :条件表达式?表达式1 : 表达式2,如果条件表达式的值为真则整个三目表达式的值是表达式1的值,否则是表达式2的值

例如:

int a = 3;
int b = 4;
int c = (a > b)?a:b;	// c的值是b
int d = (a < b)?a:b; 	// d的值是a

一旦前面的条件表达式确定为真或假,直接计算后面对应的一个表达式,而不会再计算另一个表达式的值,例如:

int a = 3;
int b = 4;
int c = (a > b) ? (a = 1):(b = 2);
// 结果为b == 2,c == 2, a == 1,因为a = 1的值并未执行

sizeof()运算符

sizeof()并不是一个函数调用,而是一个运算符。sizeof(x)表达式的值是操作数x所占的字节数。
例如:

int a = 10;
sizeof(a);	// 值为4,因为int类型占4字节

如果对数组名使用sizeof()运算符,则表达式的值是整个数组所有元素所占的字节总数:

int arr[12];
sizeof(arr);	// 值为12*4 == 48

前面提到,数组名本身作为一个变量(实际上不可修改),但sizeof()运算符作用于数组名得到的不是它本身的字节数,这一点要结合指针才能解释清楚。

逗号运算符

逗号运算符可以连接(隔开)多个表达式,而逗号连接的多个表达式整体又被看作一个表达式,这个表达式的值为最右边的表达式的值。例如:

int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = (a, b, c, d);	// e的值是d的值4

必须将整个逗号运算符连接的表达式用括号括起来,否则将编译错误:

int e = a, b, c, d;	// a,b,c,d重复定义错误

另外,逗号运算符中的每个子表达式的值都会被执行计算:

int e = (a=10,b=c,c=30,d=40);
// 结果为a=10,b=3,c=30,d=40.4=40

可见,逗号运算符连接的多个子表达式的计算顺序是从左向右进行的。
像如下的初始化语句中:

int a,b,c = 10;
//被认为是单独的3条初始化语句

这不算做逗号运算符的使用,因为a,b,c均被初始化。
同理下面的代码也不是在使用逗号运算符:

int a = 1;
int b = 2;
int c = 3;
a, b, c = 10;	// 仅c被赋值为10
//被认为是a;b;c=10;

类型转换运算符

前面提到过,强制类型转化可以将一个表达式的类型强制转换为其他类类型,例如:

char a = 10;
int b = (int)a;

虽然上面的代码和隐式类型转换没什么区别,但说明实际是可以通过(type)(表达式)的形式强制改变类型的。但要注意的是,强制类型转换是生成一个临时的指定类型变量,而不是改变原表达式本身的类型。上面的代码中(int)a的类型是强制转换来的,但变量a的类型还是char,并没有变成int。
C/C++中,一个变量在定义时的类型就确定了、不能改变(字面量在使用时类型也确定了),类型转换的含义不是改变其类型而是产生一个指定类型的临时量来重新存放该值。

一元+、-运算符

+、-运算符既可以是二元的加减,也可以是一元运算符,例如:

int a = -10;
int b = -a;
int c = +b;
float f = -123.45;

+不起任何作用。-对于整数来讲是将整数的二进制串取补码,对于一个unsgined类型整数使用"-"运算符也不会将其变成signed类型,不过将一个整数赋值给大宽度的整数变量时,如果对这个整数使用”-“运算符,则会当作signed类型扩展符号位而不是,这一点在之前整数相关的部分提到过。

()运算符和[]运算符

()运算之前就多次使用,通常是用来改变表达式的计算顺序(像数学中的括号那样),再就是可以将多个表达式当作一个整体(如逗号运算符中必须使用括号指明)。
[]运算符则只用于数组的定义和数组索引获取数组元素。

&运算符和*运算符

&运算符和*运算符通常结合指针使用,将结合指针再进行解释。

.运算符和->运算符

.运算符和->运算符用于检索结构体成员,将结合结构体在进行解释。

运算符的优先级

如果一个表达式使用了多个优先级,则需要确定先计算哪个子表达式再计算哪个子表达式。像数学中的四则运算,运算符都有默认的优先级,一个表达式计算时总是先计算优先级高的运算符连接的子表达式。
C语言中运算符有默认的优先级,可以参考运算符的优先级
在实际应用中,我们不必关心运算符默认的优先级,因为()运算符的优先级最高,所以可以对子表达式使用()运算符改变计算的优先级。

运算符的结合性

运算符的结合性是指连接两个操作数(子表达式)的运算符构成大的表达式时,这两个子表达式应该是同一级别的,先计算左边子表达式还是先计算右边子表达式。例如:

int a,b,c,d;
a = b = c = d;
// 赋值运算符结合性为从右到左,所以先计算(b = c = d)再计算a,由于又遇到赋值运算符所以再一次先计算右边,整体来看也是从右到左依次赋值

之前提到的逗号运算符结合性则是从左向右。其他运算符的结合性可参考:运算符的结合性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值