嵌入式学习之路(十五)——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是可以++p,p--,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(里面的表达式是不执行的),所以打印出来是4,10
好了。知道了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=2;2+ 2 = 4;
我们稍微改一下,
i=i++ + ++i;
printf(“%d\n”,i);
正确答案:D:i最后又执行了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是有符号的字符型,范围是-128到127,200是正数,明显超过127的范围?
我们来看一下200的二进制11001000,因为他是有符号的,所以,1就是符号位,说明a是一个负数,所以我们对200取反加一,再加个负号就是输出的值了
00110111 + 1 = 0011 1000 = 56所以a= - 56
而对于b,b是无符号的字符型,范围是0到255,因为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
大家自己算吧,下次有空再讲一下