1.在C语言中,以下哪个运算符具有最低的优先级?
A.逻辑与(&&)
B.位异或(^)
C.逻辑或(||)
D.赋值(=)
D
2.关于表达式求值说法不正确的是:( )
A.表达式求值先看是否存在整形提升或算术转换,再进行计算
B.表达式真正计算的时候先看相邻操作符的优先级再决定先算谁
C.相邻操作符的优先级相同的情况下,看操作符的结合性决定计算顺序
D.只要有了优先级和结合性,表达式就能求出唯一值
A:正确
B:正确
C:正确
D: 错误,有了优先级和结合性,表达式也有可能有不同的计算路径,导致计算结果的差异。
3.下面代码的结果是:( )
#include <stdio.h> int main() { int i = 1; int ret = (++i)+(++i)+(++i); printf("ret = %d\n", ret); return 0; }
A.10
B.12
C.9
D.程序错误
表达式(++i)+(++i)+(++i),只有操作符的优先级和结合性,没法确定唯一计算路径
所以这个表达式可能因为计算顺序的差异导致结果是不一致的,所以表达式是错误的表达式。
可以在VS和Linux gcc测试,结果可能有差异。
4.下面代码的结果是:
#include <stdio.h> int i; int main() { i--; if (i > sizeof(i)) { printf(">\n"); } else { printf("<\n"); } return 0; }
A.>
B.<
C.不输出
D.程序有问题
C语言中,0为假,非0即为真。
全局变量,没有给初始值时,编译其会默认将其初始化为0。
i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A
这道题其实很隐蔽,真是虾仁猪心!!!
因此:选择A
5.在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。 例如:数组中有:1 2 3 4 5 1 2 3 4,只有5出现一次,其他数字都出现2次,找出5
#include <stdio.h> int find_single_dog(int arr[], int sz) { int ret = 0; int i = 0; for (i = 0; i < sz; i++) { ret ^= arr[i]; } return ret; } int main() { int arr[] = { 1,2,3,4,5,1,2,3,4 }; int sz = sizeof(arr) / sizeof(arr[0]); int dog = find_single_dog(arr, sz); printf("%d\n", dog); return 0; }
6.获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
/* 思路: 1. 提取所有的奇数位,如果该位是1,输出1,是0则输出0 2. 以同样的方式提取偶数位置 检测num中某一位是0还是1的方式: 1. 将num向右移动i位 2. 将移完位之后的结果与1按位与,如果: 结果是0,则第i个比特位是0 结果是非0,则第i个比特位是1 */ void Printbit(int num) { for(int i=31; i>=1; i-=2) { printf("%d ", (num>>i)&1); } printf("\n"); for(int i=30; i>=0; i-=2) { printf("%d ", (num>>i)&1); } printf("\n"); }
7.在C语言中,以下哪个操作符用于获取变量的地址?
A.&
B.*
C.¥
D.#
A
8.下面哪些描述是正确的?
A.内存中每个bit位都有唯一的地址
B.内存中每个字节都有地址,地址可以唯一标识一个内存单元的
C.C语言中地址就是指针,指针就是地址
D.C语言中只要有了地址就可以随意读写内存空间。
答案是:B、C
A: 每个字节分配一个地址的,不是每个bit位
D: 程序只能访问分配给自己的内存单元,否则就是非法访问了,不能随便访问内存空间的。
9.关于指针的概念,错误的是:( )
A.指针变量是用来存放地址的变量
B.指针变量中存的有效地址可以唯一指向内存中的一块区域
C.野指针也可以正常使用
D.局部指针变量不初始化就是野指针
A:正确,指针变量中存储的是一个地址,指向同类型的一块内存空间
B:正确,地址是唯一的,一个指针变量中只能存储一个地址,因此可以唯一指向内存中的一块区域
C:野指针指向的空间时非法的,或者说该指针指向的空间已经不存在了,因此野指针不能使用
D:局部指针变量没有初始化时里面就是随机值,因此指向那个位置不一定,故将其看成是野指针
因此:选择C
10.以下系统中,int类型占几个字节,指针占几个字节,操作系统可以使用的最大内存空间是多大:( )
A.32位下:4,4,2^32 64位下:8,8,2^64
B.32位下:4,4,不限制 64位下:4,8,不限制
C.32位下:4,4,2^32 64位下:4,8,2^64
D.32位下:4,4,2^32 64位下:4,4,2^64
32位系统下: int占4个字节,指针表示地址空间个数,总共有2^32个,故占4个字节 64位系统下: int占4个字节,指针表示地址空间个数,总共有2^64个,故占8个字节 因此:选择C
11.下面代码的结果是:( )
#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; }
A.1 2 3 4 5
B.0 0 3 4 5
C.0 0 0 0 5
D.1 0 0 0 0
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
B