2021-08-17

本文涵盖了C++编程的基础知识和进阶技巧,包括switch语句参数类型限制、const关键字用法、面向对象编程优点、inline与volatile关键字解析、内存分配、动态特性解释、全局变量定义、二叉树遍历、进程间通信方式、联合体应用、排序算法、内存大小计算、字节序理解、位运算技巧、内核同步方法、Shell脚本基础及Linux命令运用,适合初学者和进阶开发者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.不能做switch()的参数类型是???
答:switch()的参数类型不能为实型。
switch()的参数类型可以为char,short,int,long,bool,枚举类型等。
不支持float,double,string.
2.C++中如何声明const void f(void)函数为C程序中的库函数???
答:使用extern关键字,extern “C” const void f(void).
3.const char* p 和 char* const p的区别???
答:const char *p :是指针,具体类型是指向char,在char前面有一个const修饰,所以p所指向的内容为const类型不可修改。
char * const p: const修饰的是p,p不能修改,p所指向的内容可以修改。
4.写出面向对象程序设计的优点???
答:首先考虑面向对象的特点,面向对象的程序设计有“抽象”、“封装”、“继承”、“多态”四个基本特点。根据特点我们可以得出面向对象的程序设计方法继承了结构化程序设计方法的优点,同时又比较有效地克服了结构化程序设计的弱点。
5.关键字volatile,inline有什么用???
答:
inline:inline关键字一般用于定义内联函数,所谓内联函数与一般函数的区别是:1.内联函数一般比较短小,只有几行代码。2.调用内联函数没有调用一般函数所必需的保护堆栈的开销,调用时直接把它嵌入到调用函数中。inline与宏定义十分相似,但是必须知道它们之间的区别:调用inline时会进行类型检查,而宏定义是没有类型检查的。
volatile:用它定义的变量在程序编译阶段不做优化,每次都不必须从内存中读取变量的值。
6.分别写出bool,int,float,指针类型变量a与零的比较???
答:bool是布尔类型用作逻辑判断。
bool取值false和true,0为false,非0为true。`
bool: if(!a) or if(a)
int: if(a != 0) or if(a == 0)
指针类型变量:我们用int * p 来举例:if(p ==NULL) or if(p != NULL)
float:首先考虑float型数据在内存中的存储方式,主要需要看精度。所以没有办法直接比较。不管是单精度还是双精度,道理都类似。所以你可以这样做:

#define E 0.000001
if((x >= -E) && (x <= E)

7.为Type * s 在堆中开辟分配空间???
答:首先考虑内存申请函数,malloc,calloc等等
例如:Type* s = (Type*)malloc(sizeof(Type)).
8.什么为动态特征???
答:在绝大多数情况下,程序的功能是在编译的时候就确定下来的,我们称为静态特性。反之,如果程序的功能是在运行时刻才确定下来的,则称为动态特性。动态特性是面向对象语言最强大的功能之一,因为它在语言层面上支持程序的可扩展性,而可扩展性是软件设计追求的重要目标之一。
9.全局变量可不可以定义在可被多个.c文件包含的头文件中???为什么??
答:可以,在头文件或不同的c文件中用static来修饰同名全局变量。
10.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是?
答:
中序遍历:DEBAC
后序遍历:DABEC
推导如下:
1、从后序可知树根为C,因为最后的节点是树根。
2、从中序的规则可知树根在中间,树根的左边是左孩子,右边是右孩子。很明显树根C是没有右孩子,只有左孩子DEBA。
中序遍历:DEBA
后序遍历:DABE
推出E是左子树的根结点,并且存在左子树D,右子树BA,因为从中序遍历可知E的左边是D,右边是BA
中序遍历:BA
后序遍历:AB
推出B是右子树的根结点,并且存在右子树,但没有左子树,因为从中序遍历可知B只有右子树,没有左子树。
前序为:CEDBA
1.前序遍历:根、左、右
2.中序遍历:左、根、右
3.后序遍历: 左、右、根
11.进程间通讯方式有哪些???
答:进程间通讯方式有:管道,信号,信号量,消息队列,共享内存,套接字。
12.

#include<stdio.h>
union
{
	int i;
	int j;
}a;

int main()
{
	a.i=5;
	a.j=6;
	
	printf("%d",a.j);
	printf("%d",a.i);
}    
输出结构是:6 6                                                                                                                                                                                        

不会做的话或者不能理解就去看联合体啥意思
13.完成程序,对数组进行降序排列。
复习排序算法去。
14.下面的程序是否存在问题?如果有指出来

void GetMemory(char**p,int num)
{
	*p = (char*)malloc(num);
	//没有判断是否申请成功
}
void Test(void)
{
	char* str = NULL;
	GetMemory(&str,100);
	srtcpy(str,"hello");
	printf(str);
	//没有进行free
}

15.在某32位操作系统下C++程序,请计算sizeof的值

char str[] = "raysharp.cn"
char* p = str;
int n = 10;
请计算
sizeof(str) = ?		//12
sizeof(p) = ?		//4
sizeof(n) = ?		//4
void Foo(char str[100])
{
	//请计算
	sizeof(str) = ?			//4
}
void* p = malloc(100);
	//请计算
	sizeof(p) = ?			//4

16.32bit的数0x12345678在Little-endian模式和Big-endian模式下CPU内存中的存放方式(假设从地址0x4000开始存放)
答:

  1. Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
  2. Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
    数字0x12 34 56 78在内存中的表示形式为:
    1)大端模式:
    低地址 -----------------> 高地址
    0x12 | 0x34 | 0x56 | 0x78
    2)小端模式:
    低地址 ------------------> 高地址
    0x78 | 0x56 | 0x34 | 0x12
内存地址     小端模式存放内容	      大端模式存放内容
0x4000			  0x78						0x12
0x4001			  0x56						0x34
0x4002			  0x34						0x56
0x4003			  0x12						0x78
//测试自己的设备是大端还是小端
#include <stdio.h>
#include <stdlib.h>
int main()
{

	int a=0x1234;
	char b=*(char*)&a;
	if(b==0x12)
		printf("big end\n");
	else
		printf("little end\n");
	return 0;
	}

17.写一个函数计算long变量中有多少个bit的值为1???
看大佬的,贼详细
18.Linux有哪些内核同步的方法?
继续看大佬的
19.用shell脚本,写一个简单地判断程序。判断变量a=0,显示“correct”,a=1显示“incorrect”

#! /bin/bash

read -p "请输入0或者1:" a

if [ $a -eq 0 ]
then
        echo "correct"
fi

if [ $a -eq 1 ]
then
        echo "incorrect"
fi

        echo "error"

20.用Linux命令查找当前文件下所有的.c文件???
答:ls ./*.c
21.写出判断ABCD的四个表达式是否正确,若正确,写出经过表达式中a的值???
int a = 4;
(A)a += (a++) ==== 9
(B)a += (++a) ==== 10
(C)(a++) +=a ==== 不对
(D)(++a)+= (a++) ==== 11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值