事隔一年,再入代码;舍弃前端,入手嵌入;C两周后,小记一篇(1)。

事隔一年,再入代码;舍弃前端,入手嵌入;C两周后,小记一篇(1)。,第1张

为什么事隔一年呢,全心半意为了提升学历,奈何实力不够。


作罢,遂入“社畜”。


        起初在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.预告

下一篇啃大头--数组、指针、数组与指针的运用。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/564918.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存