一些覆盖C语言许多知识点的题目,第一阶段的课程从3月8日到现在已经进行了六周,
感觉自己不会的东西越来越多,面对计算机的时间也越来越长,眼睛现在已经有点模糊了,
希望自己能对得起自己的这份努力,加油,加油,加油!
____________________________________________________________
1.下面的程序输出结果是多少?
____________________________________________________________
2.下面的程序输出结果是多少?
/*这种题目是很有争议的,在vc和Linux的gcc编译器下输出的结果都是8,8。
但是在我的Mac系统下的gcc输出的结果却是7,8。在vc下的printf函数解释是从右到左,
靠堆栈传递,所以*(++ptr)先进入堆栈,然后*ptr进入,具体的我也解释不太清,坐等高人解答
*/
____________________________________________________________
3.下面的程序输出结果是多少?
____________________________________________________________
4.下面程序的结果是多少?
#include<stdio.h>
//这道题目也很有趣,普通的变量进入printf,补位的时候补0;
//然而指针变量补位的时候补的是F。
____________________________________________________________
5.用一个表达式,判断一个数X是否是2n次方(2,4,8,16…),不可用循环语句。
运用位操作,2^n次方数的二进制只有1位是1,运用一个表达式就可以判断。
____________________________________________________________
6.下面程序的结果是多少?
____________________________________________________________
7.如何将a和b的值进行交换,并且不使用任何中间变量。
____________________________________________________________
8.编写一个函数,要求输入年、月、日、时、分、秒,输出该时间的下一秒。
如输入2010年12月31日23时59分59秒,则输出2011年1月1日0时0分0秒。
就是单纯的判断,在这里就不赘述了
____________________________________________________________
9.编写一个函数,实现把C/C++程序代码中的注释去掉,并把结果返回。A.c---b.c
比较有难度的一道题,另写一篇博文解释。
____________________________________________________________
10.一个5位数字ABCDE*4 = EDCBA,这5个数字不重复,请编程求出来这个数是多少?
五个变量,五个循环加一个判断就可以。
____________________________________________________________
11.用预处理指令#define声明一个常数,用以表示1年中有多少秒(忽略闰年)。
____________________________________________________________
12.编写一个"标准"宏MIN,这个宏输入两个参数并返回其中较小的一个。
____________________________________________________________
13.const有什么用途,请说出最少两个。
1.定义常量
2.修饰,返回值,参数,函数,指针,在静态编译时让编译器帮助检查是否对某些变量进行了修改
____________________________________________________________
14.const于#define相比有什么不同?
(1) 编译器处理方式不同
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
const常量会在内存中分配(可以是堆中也可以是栈中)。
____________________________________________________________
15.下面代码的输出结果是什么?
____________________________________________________________
16.下面程序的输出结果是什么?
____________________________________________________________
17.以下代码的输出结果是什么?
____________________________________________________________
18.下列程序会在哪一行崩溃?
____________________________________________________________
19.
写出函数指针、 // void (*pf)(); void func(); pf = &func;
函数返回指针、 // void* func();
const指针、 //char *const p;
指向const的指针、 // const char *p;
指向const的const指针。 // const char *const p;
感觉自己不会的东西越来越多,面对计算机的时间也越来越长,眼睛现在已经有点模糊了,
希望自己能对得起自己的这份努力,加油,加油,加油!
____________________________________________________________
1.下面的程序输出结果是多少?
#include<stdio.h>
int main()
{
int x=2,y,z;
x *=(y = z = 5);printf("%d\n”,x); //10 后面表达式的结果是5
z = 3;
x ==(y = z); printf("%d\n”,x); //10 只是判断,没有给x赋值
x =(y == z); printf("%d\n”,x); //1
x = (y&z); printf("%d\n”,x); //3 位与操作
x = (y&&z); printf("%d\n”,x); //1
y = 4;
x = (y | z); printf("%d\n”,x); //7 位或操作
x = (y || z); printf("%d\n”,x); //1
return 0;
}
____________________________________________________________
2.下面的程序输出结果是多少?
#include<stdio.h>
main()
{
int b = 3;
int arr[] = {6,7,8,9,10};
int *ptr = arr;
*(ptr++)+=123; // arr[0]变成129,ptr指向arr[1]
printf("%d,%d\n",*ptr,*(++ptr));
}
/*这种题目是很有争议的,在vc和Linux的gcc编译器下输出的结果都是8,8。
但是在我的Mac系统下的gcc输出的结果却是7,8。在vc下的printf函数解释是从右到左,
靠堆栈传递,所以*(++ptr)先进入堆栈,然后*ptr进入,具体的我也解释不太清,坐等高人解答
*/
____________________________________________________________
3.下面的程序输出结果是多少?
#include<stdio.h>
int main()
{
unsigned char a = 0xa5; //a中装着一个16进制数 二进制为:1010 0101
unsigned char b = ~a>>4; //a参与运算,自动转换为int,b的结果二进制为
//1111 0101
printf("a = %d\n",a); //a的十进制为165
printf("b = %d\n",b); //b的十进制为245
return 0;
}
____________________________________________________________
4.下面程序的结果是多少?
#include<stdio.h>
int main()
{
unsigned int a = 0xCCCCCCF7;
unsigned char i = (unsigned char)a; //i中装着a的后两位,也就是F7
char* b = (char*)&a; //b指向a
printf("%08x,%08x",i,*b); //16进制输出,000000F7 ,FFFFFFF7
return 0;
}
//这道题目也很有趣,普通的变量进入printf,补位的时候补0;
//然而指针变量补位的时候补的是F。
____________________________________________________________
5.用一个表达式,判断一个数X是否是2n次方(2,4,8,16…),不可用循环语句。
(x & (x-1) == 0) ? printf("yes\n") : printf("yes\n")
运用位操作,2^n次方数的二进制只有1位是1,运用一个表达式就可以判断。
____________________________________________________________
6.下面程序的结果是多少?
#include<stdio.h>
main()
{
int count = 0;
int m = 9999;
while(m)
{
count++;
m = m&(m-1);
}
printf("%d\n",count); //8,进两次循环m的二进制去掉一位
}
____________________________________________________________
7.如何将a和b的值进行交换,并且不使用任何中间变量。
a = a + b;
b = a - b;
a = a - b;
//还有更快的位操作版本:
a = a ^ b;
b = b ^ a;
a = a ^ b;
____________________________________________________________
8.编写一个函数,要求输入年、月、日、时、分、秒,输出该时间的下一秒。
如输入2010年12月31日23时59分59秒,则输出2011年1月1日0时0分0秒。
就是单纯的判断,在这里就不赘述了
____________________________________________________________
9.编写一个函数,实现把C/C++程序代码中的注释去掉,并把结果返回。A.c---b.c
比较有难度的一道题,另写一篇博文解释。
____________________________________________________________
10.一个5位数字ABCDE*4 = EDCBA,这5个数字不重复,请编程求出来这个数是多少?
五个变量,五个循环加一个判断就可以。
____________________________________________________________
11.用预处理指令#define声明一个常数,用以表示1年中有多少秒(忽略闰年)。
#define S (365*24*60*60)
____________________________________________________________
12.编写一个"标准"宏MIN,这个宏输入两个参数并返回其中较小的一个。
#define min((a), (b)) ((a)<(b))?(a):(b)
____________________________________________________________
13.const有什么用途,请说出最少两个。
1.定义常量
2.修饰,返回值,参数,函数,指针,在静态编译时让编译器帮助检查是否对某些变量进行了修改
____________________________________________________________
14.const于#define相比有什么不同?
(1) 编译器处理方式不同
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
const常量会在内存中分配(可以是堆中也可以是栈中)。
____________________________________________________________
15.下面代码的输出结果是什么?
#include<stdio.h>
struct{
short a1;
short a2;
short a3;
}A;
struct{
long a1;
short a2;
}B;
int main()
{
char* ss1 = "0123456789";
char ss2[] = "0123456789";
char ss3[100] = "0123456789";
int ss4[100];
char q1[] = "abc";
char q2[] = "a\n";
char* q3 = "a\n";
char (*str1)[100] = (char(*)[100])malloc(100);
void* str2 = (void*)malloc(100);
printf("%d\n",sizeof(ss1)); //4
printf("%d\n",sizeof(ss2)); //11
printf("%d\n",sizeof(ss3)); //100
printf("%d\n",sizeof(ss4)); //400
printf("%d\n",sizeof(q1)); //4
printf("%d\n",sizeof(q2)); //3
printf("%d\n",sizeof(q3)); //4
printf("%d\n",sizeof(A)); //6 结构体都跟其中最大的的元素类型对齐
printf("%d\n",sizeof(B)); //16 跟long对齐,8*2
printf("%d\n",sizeof(*str1)); //100
printf("%d\n",sizeof(str2)); //4
return 0;
}
____________________________________________________________
16.下面程序的输出结果是什么?
#include<stdio.h>
main()
{
char *a []={"hello","the","world"};
char **pa=a;
pa++;
printf(*pa); //the
}
____________________________________________________________
17.以下代码的输出结果是什么?
#include<stdio.h>
int main()
{
int x=10,
y=10,
i;
for(i=0;x>8;y=i++)
{
printf("%d,%d",x--,y); //10, 10
return 0;
}
}
____________________________________________________________
18.下列程序会在哪一行崩溃?
typedef struct s {
int i;
int * p;
}S;
main()
{
S s; //定义一个结构体,其中有两个元素,i 和 *p
int *p = &s.i; //定义指针变量p,装着s中i的地址
p[0] = 4; //下标运算,在i中放入4
p[1] = 3; //在p中放入3
s.p = p; //把指针p中的地址,也就是s中i的地址给了s中的p
s.p[1] = 1; //下标运算,把s中的p的东西,也就是i的地址的下一位,也就是
//s中p装入一个1
s.p[0] = 2; //在这一行崩溃,p中装着一个常量,无法进行写操作
}
____________________________________________________________
19.
写出函数指针、 // void (*pf)(); void func(); pf = &func;
函数返回指针、 // void* func();
const指针、 //char *const p;
指向const的指针、 // const char *p;
指向const的const指针。 // const char *const p;