-
int arr[10];数组名是int [10]------>可以用sizeof(int [10])计算数组字节长度
-
将两个数交换值,不用第三个数
// //1. 加减法 // //缺点:数字过大会溢出 // /*int a = 10, b = 20; // a = a + b; // b = a - b; // a = a - b; // printf("%d %d", a, b);*/ // // //2. 异或法 // /*int a = 10, b = 20; // a = a ^ b; // b = a ^ b; // a = a ^ b; // printf("%d %d", a, b);*/
-
sizeof是一个操作符,不是一个函数,因为他可以计算长度不带(),比如计算数据时,计算类型不可以去()
-
sizeof()中的表达式不参与运算,如sizeof(s=a+10),s还是原来的值,没有进行运算
-
~按位取反,包括符号位全部取反
-
数组传参,传的是数组的首地址,但是本质其实是指针
void test1(int arr[])----变成了指针,指针大小不论类型4/8 { printf("%d",sizeof(arr));----->4/8 } void test2(char ch[]) { printf("%d",sizeof(ch));------>4/8 } int arr[10]={0}; char ch[10]={0}; test1(arr); test2(ch);
-
&&左边为假,右边不要算了;||左边为真,右边不要算了
-
int arr[5]={1,2,3,4,5};
printf(“%d\n”,arr[4]);---->[]就是下标引用操作符,[]的操作数是2个:arr,4
-
int ret=Add(a,b);------>():函数调用操作符
-
隐式类型转换
- C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
- 再执行运算。运算完成之后,结果将被 截断 ,然后再存储
- 整型提升,若果是无符号位,高位补0;有符号位,高位补现在最高位数字
//整型提升理解1
char a=3;
char b=127;
char c=a+b;
printf("%d",c);
/*
1. a: 00000000000000000000000000000011
2. b: 00000000000000000000000001111111
3. a+b: 00000000000000000000000010000010
4. 截断: 10000010
5. 由于打印的为%d是整型,所以还要发生整型提升:(因为a+b是有符号数,整型提升高位补充符号位)
11111111111111111111111110000010
6. 补码转换为反码(-1): 11111111111111111111111110000001
7. 反码变原码: 10000000000000000000000001111110
8. 即c=-126
a和b的值被提升为普通整型,然后再执行加法运算。
加法运算完成之后,结果将被 截断 ,然后再存储于a中
*/
//整型提升理解2
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;
}
/*
a,b要进行整形提升,但是c不需要整形提升 a,b整形提升之后,变成了负数,所以表达式
a==0xb6 , b==0xb600 的结果是假,但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真
*/
-
~取反运算符取反(包括符号位),若原码为正数,正反补都相等;若为负数,符号位不变,其他位取反
-
算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类 型,否则操作就无法进行。下面的层次体系称为寻常算术转换
//向上转换
long double
double
float
unsigned long int
long int
unsigned int
int
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运 算。