文章目录
day01
一、选择题
1、如下代码输出的是什么( )
int main()
{
char a = 101;
int sum = 200;
a += 27; sum += a;
printf("%d\n", sum);
}
A: 327 B: 99 C: 328 D: 72
解析:
为什么不是328而是72呢?
因为a是char,sum是int,两个类型不同的数要做运算时,会发生整型提升。
101
01100101
整型提升后高位补0
原码 --> 符号位不变其他位按位取反得到反码 --> 反码+1得到补码
正数原反补相同
00000000 00000000 00000000 01100101 原码
200
11001000
27
00011011a+ = 27
128
但是取值范围是-128~127 128超过了这个范围
10000000高位是1(负数),计算机存储的就是-128
所以在下一步sum+=a;
200-128=72
2、对于下面代码执行后输出的是什么( )
int value = 1024;
char condition = *((char*)(&value));
if(condition) value += 1; condition = *((char*)(&value));
if(condition) value += 1; condition = *((char*)(&value));
printf("%d %d", value, condition);
A: 1026 1 B: 1025 0 C: 1025 1 D: 1024 0
解析:
将1024化成十六进制为:0x0400
题中&value取地址相当于取首地址(低地址)
若数据是采用大端存储方式,则低地址对应的是数据的高位,即最左边的0.
则condition = 0,不执行两个if语句,则value不变,还是1024,
若数据是采用小端存储方式,则低地址对应的是数据的地位,即最右边的0.
则condition = 0,不执行两个if语句,value值还是1024.
大端字节序存储:
指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中0x 04 00
低 高
小端字节序存储:
指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中
00 04 0x
低 高
3、假设在32位机器上,读代码选结果( )
void func(char para[100])
{
void *p = malloc(100);
printf("%d, %d\n", sizeof(para), sizeof(p));
}
A: 4,4
B: 100,4 C: 4,100 D: 100,100
解析:
通常情况下,我们说的数组名都是数组首元素的地址
sizeof(数组名),这里的数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小
sizeof(指针) 得到的是 计算机系统的地址字节数,返回4(一般是4 or 8但题目说了在32位机器上所以是4)
如果这样的话,那么sizeof(para)应该是100,而不是4,但这里是C语言的bug,数组在有些条件下会隐式转变成指针 因为para数组前面是char,所以是依旧是4
4、以下程序执行后的输出结果为( )
#include <stdio.h>
void func(char *p)
{ p = p + 1; }
int main()
{
char s[] = {'1', '2', '3', '4'};
func(s);
printf("%c", *s);
return 0;
}
A: 2
B: 编译错误 C: 1 D: 无法确定
解析:
s使用指针访问值
这里访问的是数组第一个元素的值
因为func函数中运算的不是指针,就不进行运算
如果是p = *p+1;那么打印出的值就是2
5、已知数组D的定义是 int D[4][8]; 现在需要把这个数组作为实参传递给一个函数进行处理。下列可以作为对应的形参变量说明的是【多选】( )
A: int D[4][] B: int *s[8] C: int(*s)[8] D: int D[][8]
解析:
二维数组可以省略前一个数
int* s[8] s是数组
int (*s)[8] s是一个指向数组的指针
所以AB都是错误写法
二、编程题
1、自守数是指一个数的平方的尾数等于该数自身的自然数。请求出n(包括n)以内的自守数的个数
例如: 25^2 = 625 , 76^2 = 5776 , 9376^2 = 87909376 。
输入描述:int型整数
输出描述:n以内自守数的数量。
实例:
输入:5
2000
输出:3
8
说明:对于样例一,有0,1,5,这三个自守数
#include <stdio.h>
int main()
{
int n = 0;
while(scanf("%d",&n)!=EOF)//多组输入
{
int k,s = 0;
for(int i=2;i<n;i++)
{
s = i*i;//平方
if(s%10==i||s%100==i||s%1000==i||s%10000==i)
//如果只要有个位十位百位千位其中一个相等,因为求的是尾数
{
k++;
}
}
printf("%d\n",k);
}
return 0;
}
2、返回小于 N 的质数个数
输入描述:一个整数N
输出描述:小于N的质数数量
备注:0、1 不属于质数。
示例:
输入:10
输出:4
说明:N=10,质数有 [2, 3, 5, 7]
C++
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n = 0;
int ret = 0;
cin >> n;
for (int i = 2; i <= n; i++)
{
int flag = 0;
for (int j = 2; j <= sqrt(i); j++)
{
if (i%j == 0)
{
flag = 1;
break;
}
}
if (flag == 0)
{
ret++;
}
}
cout << ret << endl;
return 0;
}
C
#include<stdio.h>
#include<math.h>
int main()
{
int N=0,count=0,i,j;
scanf("%d",&N);
for(i=2;i<=N;i++)
{
int k=i;
for(j=2;j<=sqrt(k);j++)
{
if(k%j==0)
break;
}
if(j>sqrt(k))
{
count++;
}
}
printf("%d\n",count);
return 0;
}