放假只能打游戏?我们还可以学习操作符的性质
Posted build小春宝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了放假只能打游戏?我们还可以学习操作符的性质相关的知识,希望对你有一定的参考价值。
目录
表达式求值
之前浅谈了一下表达式求值,主要是针对赋值表达式和判断表达式,今天来讲一下算术表达式的一些特别的性质,算术表达式的求值一般要很久运算符的优先级和结合性,但是有时候也需要一些特殊的性质
隐式类型转换
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
当我们遇到这种表达式的时候,不需要去疑惑答案的正确性,因为这本身就是个问题
今天的博客分享就到这了,下一期指针,更精彩哦!
以上是关于放假只能打游戏?我们还可以学习操作符的性质的主要内容,如果未能解决你的问题,请参考以下文章