C语言习题~day14

简介: C语言习题

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

目录
相关文章
TU^
|
6天前
|
存储 C语言
C语言习题~day35
C语言习题~day35
TU^
9 1
TU^
|
6天前
|
C语言
C语言习题~day39
C语言习题~day39
TU^
8 0
C语言习题~day39
TU^
|
6天前
|
存储 C语言
C语言习题~day38
C语言习题~day38
TU^
4 0
TU^
|
6天前
|
C语言
C语言习题~day37
C语言习题~day37
TU^
5 0
TU^
|
6天前
|
算法 程序员 C语言
C语言习题~day36
C语言习题~day36
TU^
10 1
TU^
|
6天前
|
存储 C语言
C语言习题~day34
C语言习题~day34
TU^
7 1
TU^
|
6天前
|
算法 C语言
C语言习题~day33
C语言习题~day33
TU^
8 1
TU^
|
6天前
|
C语言
C语言习题~day32
C语言习题~day32
TU^
7 1
TU^
|
6天前
|
编译器 C语言
C语言习题~day31
C语言习题~day31
TU^
6 2
TU^
|
6天前
|
C语言
C语言习题~day30
C语言习题~day30
TU^
5 1