位操作符:针对二进制的操作
~:按位取反
<< : 左移 乘法,乘以2的N次方,高位的非符号位舍弃
>> : 右移 除法,除以2的N次方,高位的非符号位补零,低位舍弃
& | ^ :异或
++ —在运算中的组合
在printf()语句中, printf在确定哥哥变量的结果时,顺序为从后往前
printf(“%d%d%d”,a,b,c); c–> b–>a
x++ ———–> 取值后加
x– ———–>取值后减
++x ———–>最后确定,不能确定最后是什么最后
–x ———–>最后确定,不能确定最后是什么最后
贪心算法
编译器在出现二异性时,编译器会选择尽可能多的结合运算符
#include<stdio.h>
int main(void)
{
int x=7;
printf(“x++:%d,x++:%d,x++:%d\n”,x++,x++,x++);
x=7;
printf(“++x:%d,++x:%d,++x:%d\n”,++x,++x,++x);
x=7;
printf(“x++:%d,++x:%d,x++:%d\n”,x++,++x,x++);
x=1;
printf(“%d,%d,%d,%d,%d,%d\n”,++x,x++,++x,x++,x++,++x);
//7,2,3,7,6,7
x=1;
printf(“%d,%d,%d,%d,%d,%d\n”,++x,x++,–x,x–,x++,++x);
//x 1 x 3 2 x
//3 1 3 3 2 3
x=1;
int y=(++x)+(x++); //2+2
printf(“(++x)+(x++):%d\n”,y);
int a=1;
int b1=a+a; //2
// int b2=a++a; //error
int b3=a+++a; // (a++) +a = 3
// int b4=a+++++a; // ((a++)++) +a= error ++ 操作带回写
// 表达式的值不能进行++ (a+b)++ error
a=1;
int b5=a+++a+++a+++a; //(a++)+(a++)+(a++)+a
printf(“b3:%d\n”,b3);
printf(“b5:%d\n”,b5);
return 0;
}
问号表达式
int res = a>b?a:b
当问号表达式确定整个表达式的值时,另外一边的运算不被执行。
逗号表达式
表达式整体的值为最后一个表达式的值。
隐式类型转换
注意无符号和有符号间的转换。
当一个int *float —>float
signed * unsigned —> unsigned
空格在C 语言中的意义
int a;
int *p=&a;
int b=100/*p; //此处代码通不过,因为 /**/为注释 改为:b=100/ *p 加一个空格即可
数组 —》 聚合数据类型
数组是一组有相同数据类型的数据的集合
格式:存储类型 数据类型 数组名[常量表达式]
数组长度是编译器决定的。数组放在stack
数组在stack是连续存放的,并且是字对齐,不存在奇数
数组越界访问属于非法操作,会引发段错误或其他异常,编译器不会检查数组越界错误,需要由程序员自行检查数组越界错误。
数组名的含义:
左值:整个数组,不要将数组名作为左值来操作,除非用于初始化。
右值:地一个元素存放的地址
sizeof(左值) 默认为左值
int *p=array;
sizeof(p) —> 4 在32位平台,所有指针大小为4