前言
不知不觉这个专栏都更到第十篇文章了,真快啊,继续加油。
今天给大家带来的是六道选择题,明天会出五道我最近在做题的时候遇到的有意思的编程题。
话不多说,直接看今天的题。
1.
题干:
下面代码的运行结果是:
#include <stdio.h> int main() { int a, b, c; a = 5; c = ++a; b = ++c, c++, ++a, a++; b += a++ + c; printf("a = %d b = %d c = %d\n:", a, b, c); return 0; }
答案:
a = 9 b = 23 c = 8
解析:
#include <stdio.h> int main() { int a, b, c; a = 5; c = ++a;// ++a:加给a+1,结果为6,用加完之后的结果给c赋值,因此:a = 6 c = 6 b = ++c, c++, ++a, a++; // 逗号表达式的优先级,最低,这里先算b=++c, b得到的是++c后的结果,b是7 // b=++c 和后边的构成逗号表达式,依次从左向右计算的。 // 表达式结束时,c++和,++a,a++会给a+2,给c加1,此时c:8,a:8,b:7 b += a++ + c; // a先和c加,结果为16,在加上b的值7,比的结果为23,最后给a加1,a的值为9 printf("a = %d b = %d c = %d\n:", a, b, c); // a:9, b:23, c:8 return 0; }
知识点:
这道题涉及到两个知识点:
++运算符和逗号表达式
++运算符:分为前置++和后置++,
前置++:先加1,后使用,即先使用变量中内容,然后给结果加1
后置++:先使用变量中内容,整个表达式结束时,给变量加1
逗号表达式,取最后一个表达式的值
2.
题干:
下面代码的输出结果是:
#include <stdio.h> int i; int main() { i--; if (i > sizeof(i)) { printf(">\n"); } else { printf("<\n"); } return 0; }
A>
B<
C不输出
D程序有问题
答案:
A
解析:
C语言中,0为假,非0即为真。
全局变量,没有给初始值时,编译其会默认将其初始化为0。
i的初始值为0,i–结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8
3.
题干:
下面代码的运行结果是:
#include <stdio.h> int main() { int arr[] = {1,2,3,4,5}; short *p = (short*)arr; int i = 0; for(i=0; i<4; i++) { *(p+i) = 0; } for(i=0; i<5; i++) { printf("%d ", arr[i]); } return 0; }
答案:
0 0 3 4 5
解析:
```c arr数组在内存中的存储格式为: 0x00ECFBF4: 01 00 00 00 0x00ECFBF8: 02 00 00 00 0x00ECFBFC: 03 00 00 00 0x00ECFC00: 04 00 00 00 0x00ECFC04: 05 00 00 00 指针p的类型为short*类型的,因此p每次只能所有两个字节,for循环对数组中内容进行修改时,一次访问的是: arr[0]的低两个字节,arr[0]的高两个字节,arr[1]的低两个字节,arr[1]的高两个字节,故改变之后,数组中内容如下: 0x00ECFBF4: 00 00 00 00 0x00ECFBF8: 00 00 00 00 0x00ECFBFC: 03 00 00 00 0x00ECFC00: 04 00 00 00 0x00ECFC04: 05 00 00 00 故最后打印:0 0 3 4 5
4.
题干:
下面代码描述正确的是:
struct student { int num; char name[32]; float score; }stu;
A、stuct是结构体类型的关键字
B、struct student是用户定义的结构体类型
C、num、score都是结构体成员名
D、stu是用户定义的结构体类型名
答案:
D
解析:
stu是定义的结构体类型变量,不是名称。
如果想要让stu为结构体类型名称时,必须在结构体定义时添加 typedef关键字
5.
题干:
程序的执行结果是:
int main() { unsigned char a = 200; unsigned char b = 100; unsigned char c = 0; c = a + b; printf(“%d %d”, a+b,c); return 0; }
答案:
300 44
解析:
printf在传入参数的时候如果是整形会默认传入四字节,所以a+b的结果是用一个四字节的整数接收的,不会越界。而c已经在c = a + b这一步中丢弃了最高位的1,所以只能是300-256得到的44了。
补充说明
由于printf是可变参数的函数,所以后面参数的类型是未知的,所以无论传入的是什么类型,printf只会根据类型的不同将用两种不同的长度存储。其中8字节的只有long long、float和double(注意float会处理成double再传入),其他类型都是4字节。所以虽然a + b的类型是char,实际接收时还是用一个四字节整数接收的。另外,读取时,%lld、%llx等整型方式和%f、%lf等浮点型方式读8字节,其他读4字节。
6.
题干:
unsigned int a= 0x1234; unsigned char b = *(unsigned char *)&a;
在32位大端模式处理器上变量b等于( )
答案:
0x00
解析:
大端序中,低地址到高地址的四字节十六进制排列分别为00 00 12 34,其中第一个字节的内容为00
结语
今天的六道题到这里就结束了,我们下次见。