一些c/c++小题目的总结1

来源:互联网 发布:nginx编译pagespeed 编辑:程序博客网 时间:2024/06/06 05:48
1、一般赋值语句的概念和方法。求下程序输出:
#include<stdio.h>  
 
int main()  
{  
int x, y = 3, z = 4;  
x = (y = z);  
printf("x = %d\n", x);  
 
x = (y == z);  
printf("x = %d\n", x);  
 
x = (y | z);  
printf("x = %d\n", x);  
 
x = (y || z);  
printf("x = %d\n", x);  
 
x = (y & z);  
printf("x = %d\n", x);  
 
x = (y && z);  
printf("x = %d\n", x);  
 
return 0;  
}  

这里主要是想总结:按位与和逻辑与的区别。
答案:
x = 4  
x = 1  
x = 4  
x = 1  
x = 4  
x = 1  

2、i++和++i的区别 阅读代码写输出
#include <stdio.h>  
 
int main()  
{  
int i = 8;  
 
printf("i = %d\n", ++i); 9 
printf("i = %d\n", --i); 8
printf("i = %d\n", i++); 8 9
printf("i = %d\n", i--); 9 8 
printf("i = %d\n", -i++);  -8 9
printf("i = %d\n", -i--);  -9 8
 
return 0;  
}  

++i是先自加,再用,i++先用再自加。++i效率较i++高一些。
答案:
i = 9  
i = 8  
i = 8  
i = 9  
i = -8  
i = -9  

3、有符号变量与无符号变量的值的转换 看程序写输出
#include <stdio.h>  
 
char getchar(int x, int y)  
{  
char c;  
unsigned int a = x;  
(a + y > 10 ) ? (c = 1):(c = 2);  
return c;  
}  
7 + -7 
7  0000 0111
-7 1111 1001
 1 0000 0000
 
7  0000 0111
-8 1111 1000
   1111 1111
 8 0000 1000
 
int main()  
{  
char c1 = getchar(7, 4);  
char c2 = getchar(7, 3);  
char c3 = getchar(7, -7);  
char c4 = getchar(7, -8);  
 
printf("c1 = %d\n", c1);  
printf("c2 = %d\n", c2);  
printf("c3 = %d\n", c3);  
printf("c4 = %d\n", c4);      
 
return 0;  
}  

先说明一下Getchar函数,传入两个参数,将x转化为无符号数在与y相加,结果与10比较,大于返1,否则返2。这里要注意:表达式中存在无符号数和有符号数时,所有操作数转化为无符号数。
  7和4时,都是正数,相加11,返回1。7和3相加10,返回2。
  7和-7时,以int两个字节举例,有符号数负数是其相反数取补码,最高位置一得到。-7在计算机中储存:11111001,再将之以无符号数去看,这是一个非常大的数,00000111+11111001 = 100000000,结果正好刚溢出,所以得到结果0,函数返回2。
  7和-8时,-8在计算机中储存:11111000,00000111+11111000 = 11111111,差1溢出,所以这是一个非常大的一个数字,明显大于10,返回1。
答案:
c1 = 1  
c2 = 2  
c3 = 2  
c4 = 1  


4、为什么标准头文件都有类似以下的结构?
#ifndef _HEAD_H  
#define _HEAD_H  
#ifdef _cplusplus  
extern "C" {  
#endif  
/*...*/  
#ifdef _cplusplus  
}  
#endif  
#endif /*_INCvxWorksh*/

代码第1、2、10行的作用是防止该头文件被重复引用。
代码第3行作用是表示当前使用的是c++编译器。
代码第4~8行中的extern “C”是c++编译器提供的与c连接交换指定的符号,用来解决名字匹配问题。

5、#include <head.h>和#include “head.h”有什么区别?


<>表示这个文件是一个标准头文件,查找时,编译器直接去预定义的目录,可以在编译器的设置里面更改目录。“”表示这个文件是程序员自己写的工程中的头文件,查找该文件时,先从当前目录查找,然后到标准位置寻找。


6、C语言中main函数执行完后还执行其他语句吗?


执行atexit函数
  atexit函数的参数是一个函数指针,指向一个没有参数也没有返回值的函数。
int atexit(void(*) (void));  
在一个程序中最多可以用atexit注册32个处理函数,这些函数的调用顺序与其注册顺序相反,类似于先进后出的结构。


7、写出代码输出结果
#include <stdio.h>  
 
#define SQR(x)   (x*x)  
 
 (b+2*b+2)   3+2*3+2
 
int main()  
{  
int a, b = 3;  
a = SQR(b+2);  
printf("a = %d\n", a);  
 
return 0;  
}  

这里SQR(b+2)在编译时,会转化为(b+2*b+2),这样最终得到结果11

8、宏参数的连接 看代码,写输出
#include <stdio.h>  
 
#define STR(s)          #s  
#define CONS(a, b)      (int)(a##e##b)  
 
int main()  
{  
printf(STR(vck));  
printf("\n");  
printf("%d\n", CONS(2,3));  
 
return 0;  
}  
使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起。STR(vck)实际输出就是vck这个字符串,CONS(2,3)转化为2e3,也就是2x10^3 = 2000。
答案:
vck  
2000  

9、const使用时的注意点,指出下面程序中哪句话出现错误
#include <stdio.h>  
 
int main()  
{  
const int x = 1;  
int b = 10;  
int c = 20;  
 
const int* m = &b;  
int* const n = &b;  
const int* const s = &b;  
 
x = 2;  
 
m = &c;  
*m = 1;  
 
n = &c;  
*n = 1;  
 
s = &c;  
*s = 1;  
 
return 0;  
}  

对于C语言中的const有一句秘诀记住它的特性:进水楼台先得月。意为最靠近const的变量的值是不能变的,一旦发生改变就会出现错误。
错误:
  第13行中,x的值不能发生改变,出错。
  第15行的做法是可以的,没有错误,但是16行中取它的值来改变就是错的,即m是可变的*m不可变。
  第19行的做法可以,没错,但是18行的做法就是错的,即n是不可变的,但是*n可变。
  第21和22行都是错的,*s和s都是不可变的。


10、使用sizeof计算普通变量所占空间大小  计算结果:(假设32位win)
char str[] = "hello";  
char *p = str;  
int n = 10;  
sizeof(str) = ____;  
sizeof(p) = ____;  
sizeof(n) = ____;  
void func(char str[100])  char* str  
{  
sizeof(str) = ___;  
}  
void *p = malloc(100);  
sizeof(p) = ____;  

第四行,str测的是数组占的总内存大小,1x6 = 6;
  第五行,p测的是一个指针的大小,地址占4个字节,结果4
  第六行,n测的是int型数据大小,和指针一样,结果4
  第九行,函数是地址传递,str测到的还是指针大小,结果4

  第十二行,尽管十一行将p指向100字节的堆内存,但是测的还是指针大小,结果4