目录
一、操作符和表达式
单目操作符
sizeof——计算字节大小。可以括号里放变量,也可以放类型。计算变量可以省括号,类型不可以省。假如sizeof括号里放入一个赋值的式子,式子并不实际计算,计算的值仍然是按照被赋值变量的类型来计算,比如int b = 0;short a = 11;b = a - 6.结果仍然为4。并且b的值仍为0,没有变成a-6的值 。
~ 对一个数的二进制按位取反
假如a是0,按位取反,得到全部都是1的二进制数,但是这是补码,要打印的话则是打印原码,转换过来就是-1。~之后也可以放括号。
前后置++ --
int a = 3
printf("%d \n", ++a)这样打引出4。如果++a,就是先打印出3,然后a再加1,再次打印的话,结果就是4
* 间接访问操作符
解引用操作。
(类型)强制类型转换
int a = (int) 3.14
关系操作符
>
>=
<
<=
!=
==
逻辑操作符
&& 逻辑与
|| 逻辑或
&& 两者都为真,则为真,打印1。
|| 有一为真,则为真,打印1。
条件操作符
语句1? 语句2:语句3
语句1是否为真,为真就是真。结果是表达式2的值;为假,则表达式3的值是结果。
int a = 34;
int b = 5;
if (a > b)
printf("%d\n", 3);
else
printf("%d\n", -3);
b = (a >b ? 3 : -3)//或者这样写
return 0;
再者可用于比较大小
int a = 10;
int b = 20;
int max = 0;
if (a > b)
max = a;
else
max = b;
//max = (a > b ? a : b);
return 0;
逗号表达式
同逗号隔开的多个表达式。从左到右依次执行,整个表达式结果是最后一个表达式的结果
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
最后c等于13。
如果最后是一个判断语句,为真则整个表达式为真,为假则整个表达式为假。
二、下标引用、函数调用、结构成员
下标引用操作符
声明数组a[10] = { 0 },[]就是下标引用操作符,此时a[2] = 1,那么操作数就是数组名a和索引值2。
函数调用操作符
定义了get_max函数,声明a和b的值,然后int max = get_max(a , b),()就是操作符。操作数是get_max,a, b。
结构成员
struct Stu
{
char name[20];
int age;
char id[20];
};
int main()
{
int a = 10;
struct Stu s1 = { "张三", 20, 20123123 };
struct Stu* ps = &s1;
printf("%s\n", ps->name);
printf("%d\n", ps->age);
return 0;
}
一个简单的小程序。
三、表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作数在求值过程中可能需要转换为其他类型。
隐形类型转换
c的整型算术运算总是至少以缺少整型类型的精度来进行的。
为了获得这个精度,表达式中的字符的短整型操作数在使用之前被转换为普通整型,这种转换为整型提升。
整型提升是按照变量的数据类型的符号位来提升的。
char a = 3;
char b = 127;
char c = a +b;
结果是-126。尽量写详细一点
char a = 3;
char b = 127;
char c = a +b;
3对应的二进制数,由于是char类型,那就只能8位,所以截断前面的,剩下00000011。同理,127就会剩下01111111。但是当相加时,CPU内整型计算器(ALU)的操作数的字节长度一般为int的字节长度,所以需要补到32位二进制数字。相加之后等于10000010,补成32个,1为符号位,所以11111111111111111111111110000010,这是补码,要得到原码,符号位不变,10000000000000000000000001111110,结果就是-126。
算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
long double
double
float
unsigned long int
long int
unsigned int
int
下面的主动转换为上面的,比如int和double一起运算,int转换为都double
操作符的属性
优先级,结合性,控制求值顺序。两个相邻操作符,优先级如果相同,取决于结合性。不同则看优先级。
优先级不写了
结合性
从右到左计算,从左到右,无结合性
是否控制求值顺序
典型的就是逻辑与,逻辑或,条件操作符?:,以及逗号表达式。逻辑与,前面为假,那么就不需要算之后的了,这样就是控制求值顺序了
当知道所有后,所有的表达式都可以找到顺序,找不到就是本身表达式错了。
比如a*b + c*e + f*g c + --c,一些无法按照操作符的属性计算,没有唯一的计算路径,不同编译器也不同结果。
结束。