C++-刷题一

本文介绍了C语言中的浮点数表示、命令行参数、文件操作、结构化程序设计思想、标识符规则、转义字符、不可变类概念、输入输出格式控制以及内存对齐。还探讨了结构体的大小计算、STL容器的作用以及fork()系统调用在创建子进程时的行为。此外,还讨论了数组地址、函数模板和类模板的实例化过程。
摘要由CSDN通过智能技术生成

浮点数

浮点数有两种形式,一种为十进制小数形式,一种为指数形式
e前必须要有数字,e后数字只能为整数
其一般形式为a E n,a为十进制数,n为十进制整数,都不可省略。
e3 错误 只有阶码3没有尾数
2e4.2 错误 阶码部分4.2是浮点数,不是整数
.e5 错误 尾数部分不能只有小数点
-e3 错误
.234,-.18是浮点数

argc **argv

argc、argv的具体含义
argc和argv参数在用命令行编译程序时有用。main( int argc, char* argv[], char env ) 中
第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1。
第二个参数,char*型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下:
argv[0]指向程序运行的全路径名
argv[1]指向在DOS命令行中执行程序名后的第一个字符串
argv[2]指向执行程序名后的第二个字符串
argv[3]指向执行程序名后的第三个字符串
argv[argc]为NULL
第三个参数,char
型的env,为字符串数组。env[]的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值。平时使用到的比较少。

int main(int argc,char **argv)
{
	int i;
	for (i = 0; i < argc; i++)
		printf("Argument %d is %s\n", i, argv[i]);
	getchar();
	return 0;
}

在这里插入图片描述
简单点记 第一个应该就是 main里面命令的数量 第二个是程序的路径名

文件操作

w+以纯文本方式读写
w 打开只写文件
wb+是以二进制方式进行读写
w+ 打开可读写文件
wb+ 读写方式打开或建立一个二进制文件,允许读和写
r 打开只读文件
r+ 打开可读写的文件
rb+ 读写方式打开一个二进制文件
a 以附加的方式打开只写文件。
a+ 以附加方式打开可读写的文件。
ab+ 读写打开一个二进制文件

结构化程序设计的思想

结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用 goto 语句

标识符

标识符
标识符用来表示函数、类型及变量的名称,是字母、下划线和数字的排列。
1、必须用字母或下划线开头。
2、只能是字母、下划线、数字的组合,不能出现其他符号。
2、大小写的含义是不同的。
3、标识符的名称不能是C语言中的关键字,关键字是具有特定含义的标识符

双击

双击即点击左键两下,第一次触发LBUTTONDOWN和LBUTTONUP,第二次点击时触发双击事件LBUTTONDBLCLK(doubleclick),放掉再触发LBUTTONUP

转义字符

  1. 一般转义字符
    这种转义字符,虽然在形式上由两个字符组成,但只代表一个字符。常用的一般转义字符为:
    \a \n \t \v \b \r \f \ \’ \”
  2. 八进制转义字符
    它是由反斜杠’‘和随后的1~3个八进制数字构成的字符序列。例如,’\60’、’\101’、’\141’分别表示字符’0’、‘A’和’a’。
  3. 十六进制转义字符?
    它是由反斜杠’‘和字母x(或X)及随后的1~2个十六进制数字构成的字符序列。例如,’\x30’、’\x41’、’\X61’分别表示字符’0’、‘A’和’a’。

不可变类

不可变类,说的是一个类一旦被实例化,就不可改变自身的状态。常见的比如String和基本数据类型的包装类,对于这种不可变类,一旦在进行引用传递的时候,形参一开始就和实际参数指向的不是一个地址,所以在方法中对形参的改变,并不会影响实际参数。

scanf

%4s表示读取一个长度为四个字符的字符串,中间的表示将读取到的字符串忽略,不赋给变量列表中的变量。

按下列分析:
%d :整数
%f :浮点值
%9s :最多有 9 个非空白符的字符串
%2d : 2 位的整数(数位 5 和 6 )
%f :浮点值(数位 7 、 8 、 9)
%*d :不存储于任何位置的整数
’ ’ :所有连续空白符
%3[0-9] :至多有 3 个十进制数字的字符串(数位 5 和 6 )
%2lc :二个宽字符,使用多字节到宽转换 */
*赋值禁止字符,跳过输入字段,不进行赋值;
%2d:2表示指定最大字段宽度,对输入数据按格式对2位整数作赋值;
字符"23456"不作赋值,故:x=12,y=78;

浮点数不用用==或!=不能精确比较

各类型字节

32位操作系统

char :1个字节(固定)

(即指针变量): 4个字节(32位机的寻址空间是4个字节。同理64位编译器)(变化)

short int : 2个字节(固定)

int: 4个字节(固定)

unsigned int : 4个字节(固定)

float: 4个字节(固定)

double: 8个字节(固定)

long: 4个字节

unsigned long: 4个字节(变化*,其实就是寻址控件的地址长度数值)

long long: 8个字节(固定)

64位操作系统

char :1个字节(固定)

*(即指针变量): 8个字节

short int : 2个字节(固定)

int: 4个字节(固定)

unsigned int : 4个字节(固定)

float: 4个字节(固定)

double: 8个字节(固定)

long: 8个字节

unsigned long: 8个字节(变化*其实就是寻址控件的地址长度数值)

long long: 8个字节(固定)

结构体

结构体内部不能定义自己的对象
例如

struct A
{
	int x;
	char y;
	A a;//这样就不被允许
	A *b;//这样是可以的
}

原因就在于在}大括号前 该结构体的类型定义尚不完整 也就是大小还没确定 所以再定义一个对象进去 会很乱 但是指针他就是4个字节 大小很容易确定

结构体大小例题

struct xx
{
    long long _x1;
    char _x2;
    int _x3;
    char _x4[2];
    static int _x5;
};
int xx::_x5;

sizeof(xx)的大小?

首先_x5是静态变量可以不用管它,其次是要考虑字节对齐的问题。对于结构体中没有含有结构体变量的情况,有两条原则:1)结构体变量中成员的偏移量必须是成员大小的整数倍;2)结构体的最终大小必须是结构体最大简单类型的整数倍。x1的偏移量是0,长度是8,0是8的整数倍 复合;x2的偏移量是8,长度是1,8是1的整数倍 符合;x3的偏移量是9,长度是4,不符合 因为偏移量需要是长度的整数倍,需要在x2之后填充3字节使得x3的偏移量达到12;x4的偏移量是16,长度是2,符合;此时总长度为(8)+(1+3)+(4)+(2)=18,而最大简单类型为long long长度为8,因此需要在x4之后再填充6字节,使得总长度达到24可被8整除。因此sizeof(xx)的结果为24。 为什么需要偏移量是长度的整数倍 因为操作系统并不能想访问哪个地址就访问哪个地址 所以如果不进行内存对齐 上面结构体的内存存放就是 x1是0 x2是8 x3是9 x4是13 那么很明显 操作系统需要去计算下一个要访问的变量地址是多少 甚至需要访问多次才能访问到想访问的下一个变量 而如果是字节对齐了 那么就可以直接按顺序访问下来就行了

STL容器(STL:即Standard Template Library,中文名为标准模板库)

printf !!!

printf(“- \n”)直接会输出一个 “-” 而printf("-")没有换行符不会直接输出,会放在缓冲区中等到程序结束后由系统处理输出

fork()(创建子进程)

系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令
例如

int main(void) {
int i;
for (i = 0; i < 2; i++) {
fork();
printf("-");
}
return 0;
}

printf(“- \n”)直接会输出一个 “-” 而printf("-")没有换行符不会直接输出,会放在缓冲区中等到程序结束后由系统处理输出 第一次循环中经过fork后有两个进程 经过printf("-")之后两个进程缓冲区中都有一个“-” 第二次进入循环经过fork后会有四个进程,且由于fork出的子进程会复制父进程的缓冲区,这时四个进程都有一个"-" 再经过printf("-")之后四个进程都有两个"-" 这时程序结束时会将缓冲区的内容全部输出,即会输出8个"-"

int main(void) {
int i;
for (i = 0; i < 2; i++) {
fork();
printf("-\n");
}
return 0;
}

输出六个

数组地址问题

在这里插入图片描述

模板

函数模板必须由编译器根据程序员的调用类型实例化为可执行的函数
类模板的成员函数都是函数模板 但是如果类中有一个模板函数 该类并不是模板类
没使用过的成员函数(即函数模板)不会被实例化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值