c语言运算符tips
赋值运算符:
int a,b;
a+b = 10;
=赋值运算符左边(左操作数)必须是左值
左值: 能放在=左边的称为左值 可以发生改变的量 称为左值
10 数值不可变
3.14 数值不可变
'a' 数值不可变
a+b 结果为一个数值,该数值不可变
算数运算符:
long long x = 365*24*60*60*1000*1000LL;
long long y = 365LL*24*60*60*1000*1000;
由于不同类型进行混合运算时: 窄字节数据自动扩充成宽字节数据进行运算
所以int与int运算为int,故x中365*24*60*60*1000已经越界。
long long与int运算结果为long long
char-->int-->long-->float-->double
short-->int
unsigned char --> unsigend int
char在进行算术运算过程中,会自动转换成int
signed和unsigned进行运算 会转换为 unsigned进行运算
自增减运算符:
++i;--i;//前加加 前减减 先进行加加减减,取自增减之后的结果进行运算
i++;i--;//后加加 后减减 先进行表达式运算,最后才进行自增减运算
int c = a+++++b;//错误
int c = a++ + ++b; ++--运算符和其它运算符之间必须要有空格
在运行一个表达式时: 首先浏览表达式,记录所有的的后加加减减,
然后计算所有的前加加减减,并且写回到变量所代表的内存中,
再然后取变量的结果进行表达式的运算和赋值,
最后进行最先记录的后加加减减
for example
#include <stdio.h>
int main()
{
a = 10;
x = a++ + ++a;
printf("x = %d\n",x);//得到结果为22,那是11+11呢还是10+12
//来验证一下
a = 10;
a = a++ + ++a;
printf("a = %d\n",a); //结果为a = 23,最后自增1,故为11+11
return 0;
}
关系运算符:
int res = 0<a<2; //恒为1 不管a的取值为多少 res结果都为1
0<a<2 需要分步计算 0<a 结果要么是0,要么是1 0 or 1<2
所以0<a<2用a>0 && a<2来表示。
#include <stdio.h>
int main()
{
int a = -20;
unsigned int b = 10;
int res = a+b>0;
printf("%d\n",res);
return 0;
}
的结果是是真是假呢?
结果为1
signed+unsigned 结果是 unsigned
sizeof:
char c = 'a';
char *p = &c;
int arr[10] = {};
printf("%u\n",sizeof(c));//1 char 1byte
printf("%u\n",sizeof('a'));//4 'a'本质是int 4byte
printf("%u\n",sizeof(c+c));//4 字符类型数据在进行运算时自动转换成int 4byte
printf("%u\n",sizeof(p));//指针一般字节数为4,不同系统不一样
printf("%u\n",sizeof(arr));//字节数等于数组长度为10
然后函数参数在中的数组退化为指针