一些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
#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
阅读全文
1 0
- 一些c/c++小题目的总结1
- 一些C基础的小编程题目
- C/C++语言的一些小总结
- 一点 C 的小题目
- c/c++小题目总结2
- 链表中一些有趣的小题目总结
- C的一些总结
- 关于一些c/c++小问题的总结
- 一些C语言题目
- 一些C语言题目
- 题目236:心急的C小加
- C 语言的一些经典题目
- C语言的一些题目(最终)
- 网上的一些经典C语言题目
- C#,一些C#的简单题目
- union(C/C++)使用的一些总结
- c语言的小总结
- 有关c的一些总结
- 完美解决主工程与lib库的FileProvider冲突
- 深度学习系列笔记之编程基础(python)
- IntelliJ IDEA下的使用git
- 【1701H1】【穆晨】【171204】连续第五十五天总结
- 机器学习实用教程(译)-2
- 一些c/c++小题目的总结1
- 编程之路
- Node.js-创建Web服务器和TCP服务器
- Spring整理系列(17)————循序渐进了解spring事务管理的几种方式
- spring boot微服务通用部署启动脚本
- 这几个问题答不对,就别说精通TCP
- ScrollView中嵌套高德地图MapView,解决触摸冲突
- 计算机的潜意识
- python安装xgboost的前提问题