为什么事隔一年呢,全心半意为了提升学历,奈何实力不够。
作罢,遂入“社畜”。
起初在java与嵌入式之间徘徊,徘徊之根源是听闻前者工资较高,作为初畜,一心只想多去丰富自己的钱包,填补四年之空缺。
后选嵌入式,大有兴趣原因,(想想能用代码实现控制小玩意就有点激动)但不是全部。
(某一人说,学C的看不起Java,遂入C门。
纯属玩笑话。
)
进入正题,C,以我一个小白的理解,算是比较接近底层硬件的高级语言吧,最重要的也是最难的就是指针了,我边看我的学习笔记,边写一些我遇到的值得记载的
1.宏定义(函数) 属于预处理的一部分 它没有运算优先级 必须在宏定义时就要定义好运算规律 意思是在主函数里面使用定义的宏时 没有运算规律
例如 你定义
#define mul(a,b) a*b
就像下面输出结果是41而不是66
int main()
{
int a=5,b=6;
int c=mul(a+b,b);
printf("%d\n",c);
}
mul(a+b,b)并不是按(a+b)*b 而是 a+b*b输出结果 并没有运算规则 他是完整的把a+b 传递给了a 其实说成没有运算规则不严谨 只是没有按照我们给他的设想去计算,它比较死,一股脑传递过去 自然成了a+b*b
#define mul(a,b) (a)*(b)
结果自然是66
2.static
分析下面两个代码段
for(i=0;i<5;i++){
static int a=0;
a++;
printf("%d\n",a);
}
for(i=0;i<5;i++){
int a=0;
a++;
printf("%d\n",a);
}
代码一结果是 1 2 3 4 5 代码二 是 1 1 1 1 1。
是不是有一点柑橘了,static修饰的局部变量只可以被定义一次,被初始化一次。
这个博主写的易懂static
这只是修饰变量。
它的作用还有很多。
参考这个博主的文章static作用
3.强制类型转换
C语言规定的转换规则是由低级向高级转换。 例如,如果一个 *** 作符带有两个类型不同的 *** 作数时,那么在 *** 作之前行先将较低的类型转换为较高的类型,然后进行运算,运算结果是较高的类型。
C语言强制类型转换本身值是不会发生改变的
例如:flaot a = 12.34 ,int b = ( int ) a ,将浮点类型的a强制转换成int类型,a本身并没有发生改变,仍然是那个float类型。
( int ) a 强制类型转换并赋值在底层实际分四个步骤:
1.先在另外的地方找一个内存构建一个临时变量 x
2.将 float a 的值的整数部分赋值给 x
3.将 x 赋值给 b
4.销毁 x
今天看到一道面试题 unsigned char c = -1; printf("c=%d", c); 结果c=255 有点疑惑
解答: 首先数据都是以补码的形式存储在电脑上,-1的原码:1 0 0 0 0 0 0 1(最高位是符号位 1表示负数 0是正数 ) 反码:1 1 1 1 1 1 1 0 补码: 1 1 1 1 1 1 1 1
因为unsigned char是无符号的 都是正数 也就没了最高位 直接把原来的符号位看成数位 即255(十进制)
看了这篇博主写的unsigned char容易理解一些,对付面试题容易哈。
4.运算顺序
这部分容易理解,记住一个截断法则
int a=-1;
int b=2;
int c=a<0||b++;
printf("a=%d b=%d c=%d",a,b,c);
遇到前一个条件为真,在此截断,于是b++不再运行。
结果为a=-1 b=2 c=1(结果返回1)
5.预告
下一篇啃大头--数组、指针、数组与指针的运用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)