操作符和表达式(C和指针)

一、操作符

1、算数操作符
● C语言常用算数操作符:
+ - * / %
● 除了 % 操作符之外,其余几个操作符既可以作用于浮点类型,又适用于整数类型。当 / 操作符的两个操作数都是整数时,它执行整数运算,在其他情况下则执行浮点数除法
● % 为取模操作符,它接受两个整型操作数,把左操作数除以右操作数,但它返回的是余数而不是商
2、移位操作符
● 移位操作只是简单地把一个值的位向左或向右移动。
● 在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则由 0 补齐
● 在右移位中,从左边移入新位时,可以选择两种方案。一种是逻辑移位,左边移入的位用 0 填充。另一种是算术移位,左边移入的位由原先该值的符号位决定,保证原数的正负形式不变
● 左移操作符为 <<
● 右移操作符为 >>
● 标准说明无符号值执行的所有移位操作都是逻辑移位,但对于有符号值,进行何种移位取决于编译器
3、位操作符
● 按位与:& ,除非两个位都为1,结果为1,否则结果为0
● 按位或:| , 除非两个位都为0,结果为0,否则结果为1
● 按位异或:^ ,如果两个位不同,结果为1,如果两个位相同,结果为0
● ~求补运算,把1变成0,0变成1
4、赋值
● 赋值是表达式的一种,用一个 等号 表示
● 只要是允许出现表达式的地方,都允许进行赋值
● 赋值操作符把右操作数的值存储于左操作数指定的位置
5、单目操作符
● C具有一些单目操作符,也就是只接收一个操作数的操作符
● ! 逻辑反,如果操作数为真,其结果为假;如果操作数为假,其结果为真
● ~ 操作符对整型类型的操作数进行求补操作,即操作数中原先为1的位变为0,原先为0的位变成1
● -操作符产生操作数的负值
● +操作数产生操作数的值(没有屁用)
● & 操作符产生操作数的地址
● * 间接访问操作符,它与指针一起使用,用于访问指针所指向的值
● sizeof 操作符判断它的操作数的类型长度,以字节为单位表示。操作数既可以是个表达式,也可以是两边加上括号的类型名:sizeof (x) sizeof(int)
● (类型) 操作符被称为强制类型转换,它用于显式地把表达式的值转换为另外的类型
6、关系操作符
● 关系操作符通常用于 if 或 while 语句中,作为测值表达式
● 表达式的结果为0,则它被认为是假
● 表达式的结果为非0,则它被认为是真
7、逻辑操作符
● && 操作符,先对左操作数进行求值,如果它的值为真,则继续对右操作数进行求值,如果左操作数的值为假,那么右操作数便不在进行求值,因为整个表达式肯定是假的。右操作数的值无关紧要
● || 操作符,先对左操作数进行求值,如果它的值是真,则不对右操作数进行求值,因为整个表达式的值已经确定,这个行为常常被称为“短路求值”
8、条件操作符
● 又称三目操作符,用法:
● 表达式1 ?表达式2 :表达式1
● 条件操作符的优先级非常低,所以它的操作数即使不加上括号,一般也不会有问题
● 首先计算表达式1的值,如果为真,则执行表达式2,否则执行表达式3
9、逗号操作符
● 可以将多个表达式分隔开来,这些表达式自左向右逐个进行求值,整个逗号表达式的值就是最后那个表达式的值
10、下标引用、函数调用和结构成员
● 下标引用操作符是一对方括号,接受两个操作数,一个数组名和一个索引值
● C的下标值总是从0开始,并且不会对下标值进行有效性检查
● 函数调用操作符接收一个或多个操作数,第一个操作数为希望调用的函数名,剩余的操作数就是传递给函数的参数
● . 和 -> 操作符用于访问一个结构体的成员,后者用于指向结构体的指针成员所使用

二、布尔值

● C语言并不具备显式的布尔类型,所以用整数来代替,其规则是:
● 0为假,其余任何非零值皆为真

三、左值和右值

● 左值就是那些能够出现在赋值符号左边的东西
● 右值就是那些可以出现在赋值符号右边的东西
● 左值与右值不可以互换
● 左值必须标识一个特定的位置

四、表达式求值

1、隐式类型转换
● C的整型算数运算总是至少以默认整数类型的精度来进行的,为了获得这个精度。表达式中的字符型和短整型操作数在使用之前被转换为普通整型,这种转换被称为整型提升
● char j, k, l;
j = k + l;
//k和l的值被提升为普通整型,然后再执行加法运算,结果将被截短,然后再存储于j中
2、算数转换
● 如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数转换为另外一个操作数的类型,否则操作就无法进行
● long double
● double
● float
● unsigned long int
● long int
● unsigned int
● int
● 寻常算数转换:如果某个操作数的类型在上面这个列表中排名较低,那么它首先将转换为另外一个操作数的类型然后执行操作
3、操作符的属性
在这里插入图片描述
在这里插入图片描述
4、优先级和求值的顺序 ● 规则:两个相邻的操作符的执行顺序由它们的优先级决定。如果它们的优先级相同它们的执行顺序由它们的结合性决定。除此之外,编译器可以自由决定使用任何顺序对表达式进行求值,只要它不违背逗号、&&、||、和?:操作符所施加的限制