嵌入式学习之路(十五)——C语言学习(10)

本文介绍了嵌入式学习中C语言的重点,包括数组与指针的关系,sizeof运算符的特性,自增操作的顺序影响,以及数据在内存中的存储方式。通过实例解析了数组元素的打印问题,sizeof表达式中的赋值操作,以及自增操作对结果的影响。还提供了一些练习题帮助读者巩固理解。
摘要由CSDN通过智能技术生成

嵌入式学习之路(十五)——C语言学习(10)

1.接下来我们先来总结一下笔试中经常会遇到的问题

数组:

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5     int arr[10] = {1,2,3,4,5,6,7,8,9,10};
  6     int i = 0;
  7     for(i = 0;i < 10;i ++)
  8     {
  9         printf("%d\n",arr++);/*数组名不能自增*/
 10     }
 11     return 0;
 12 }


我们前面讲了,数组名和指针变量可以通用,比如

intarr[5] = {1,2,3,4,5};

int*p = arr;

arr[1]= = *(p+1);

p[1]= arr[1];

p是可以++pp--,p++,--p操作,总结就是可以对p进行赋值操作

但是,arr是不能进行赋值操作的,所以上面的程序会编译出错,大家要谨慎。

题:inta[5] = {1,2,3,4,5};

int*ap = a;

inti = 0;

下列代码中,不可以成功打印出数组元素的是:

A.for(;i<5;i++){

 printf(“%d\n”,a[i]);

}

B.for(;i<5;i++){

 printf(“%d\n”,*a++);

}

C.for(;i<5;i++){

 printf(“%d\n”,ap[i]);

}

D.for(;i<5;i++){

 printf(“%d\n”,*ap++);

}

所以我们就知道,B的写法是错误

2.sizeof()

inti=10;

printf(“%d ”,sizeof(i=5));

printf(“%d\n”,i);

这里我们来讲一个知识点:sizeof(里面的表达式是不执行的),所以打印出来是410

好了。知道了sizeof()的这个特性,我们来看看下一个题目

inta = 3;

printf(“%d\n”,sizeof((a>2)?1 : 9.0));

大家觉得这个表达式会打印什么呢?

答案是8哦,为什么,这我们可以得出一个结论,sizeof()里面的表达式不计算,但是这里我们知道,这边它的确是执行了表达式?因为只有int型和double型计算,才会变成double输出才是8

所以上面的sizeof结果我们应该改一下,sizeof里不进行赋值操作,不影响结果

3.自增操作

C语言中,以下程序的输出结果为:

inti = 1;

ints = i++ + ++i;

printf(“%d\n”,s);

A.2

B.3

C.4

D.5

正确答案:C,我们来分析一下,先执行++i->i=22+ 2 = 4

我们稍微改一下,

i=i++ + ++i;

printf(“%d\n”i);

正确答案:Di最后又执行了i++,所以i= 5

4.数据在内存中的存储

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5     char a = 200;
  6     printf("a = %d\n",a);
  7     unsigned char b = 270;
  8     printf("b = %d\n",b);
  9     return 0;
 10 } 


这个输出是什么呢?a=? b = ?

我们来看一下答案:

tarena@tarena-G41MT-S2PT:~/csdn/day14$./a.out

a= -56

b= 14

和大家想的是否一样呢?

首先,a是有符号的字符型,范围是-128127200是正数,明显超过127的范围?

我们来看一下200的二进制11001000因为他是有符号的,所以,1就是符号位,说明a是一个负数,所以我们对200取反加一,再加个负号就是输出的值了

00110111 + 1 = 0011 1000 = 56所以a= - 56

而对于bb是无符号的字符型,范围是0255,因为270超过了255,所以我们来看一下二进制吧100001110,而b是无符号的,直接截断,只取后八位,所以就等于00001110 = 14

5.终极练习

unsignedchar a = 0xa5;
unsigned char b = ~a >> 1 + 2 + 3;
printf("%d\n", b);
的输出是?

A.50

B.253

C.1

D.-3

正确答案:B

大家自己算吧,下次有空再讲一下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值