放假只能打游戏?我们还可以学习操作符的性质

目录

表达式求值

隐式类型转换

整形提升的意义

整形提升的具体实例

算术转换

操作符属性表

优先级结合性表

问题表达式


表达式求值

之前浅谈了一下表达式求值,主要是针对赋值表达式和判断表达式,今天来讲一下算术表达式的一些特别的性质,算术表达式的求值一般要很久运算符的优先级和结合性,但是有时候也需要一些特殊的性质

隐式类型转换

c的整形运算总是至少以缺省整形类型的精度来进行的。为了达到这种精度,表达式中的字符和短整型往往会在使用之前被转换成普通整形。这种转换被称为整形提升

整形提升的意义

表达式的运算是在cpu的相应计算器中进行的,CPU内运算器操作数的字节长度一般都是一个整形的大小,对于char和short这种小于四个字节的操作数,cpu难以实现,往往需要先进行转换,在送进cpu进行运算

整形提升的具体实例

实例1

#include<stdio.h>
int main()
{
	char a = 0xb6;
	short b = 0xb600;
	int c = 0xb6000000;
	if (a == 0xb6)
		printf("a");
	if (b == 0xb600)
		printf("b");
	if (c == 0xb6000000)
		printf("c");
	return 0;
}
//这个程序的结果是什么呢

 最后c不需要进行整形提升,条件为真打印c,所以程序运行的结果为c

实例2

#include<stdio.h>
int main() {
	char a =1;
	printf("%u\n", a);
	printf("%u\n", +a );
	printf("%u\n", -a);
}

 看到这里希望大家可以理解整形提升

算术转换

当两个操作数类型不同时,至少需要其中一种类型转换成另一种类型,有时可能两种都要转换成int型,否则操作无法进行,下面是根据转换的优先性建立的表

long double 1
double 2
float 3
unsigned long int

4

long int 5
unsigned int  6
int  7

排名低的会转化成排名高的操作数类型,然后再进行运算

操作符属性表

优先级结合性表

运算符 结合性
()  []  ->  . 左结合
! ~ ++  -- +(正号) -(负号) *  & (类型)sizeof 右结合
* / % 左结合
+ - 左结合
<<       >> 左结合
<    <=    >   >= 左结合
==  != 左结合
& 左结合
^ 左结合
| 左结合
&& 左结合
|| 左结合
? : ; 右结合
= += -= *= /= %= &= ^= |= <<=  >>= 右结合
, 左结合

从下往上优先级越来越高

问题表达式

表达式都是有准确的值的,但是有一些表达式根据优先级和结合性,并没有唯一的计算路径,答案也不唯一,这个时候不同的编译器会有不同的结果,这种表达式被称为问题表达式,接下来给两个经典的问题表达式

经典问题表达式1:
int i=2;
int a=(i++)+(++i)+(++i);
printf("%d",a);
在vs编译器下结果为12,在gcc环境下为10
经典问题表达式2
int i=1;
printf("%d %d",++i,i++);
首先我们得知道,printf函数传参是从右往左进行的,一定是先传右边再传左边
vs编译器的结果为 3 1
vc6++编译器的结果为 2 1

当我们遇到这种表达式的时候,不需要去疑惑答案的正确性,因为这本身就是个问题

今天的博客分享就到这了,下一期指针,更精彩哦!

猜你喜欢

转载自blog.csdn.net/weixin_62753802/article/details/122506604