变量初始化、memset使用与误区、三角函数、字符串(代码经验记录2)

本文介绍了C++中变量初始化的重要性,强调了memset的使用注意事项,包括不能用于任意赋值、需要考虑元素类型和赋值字符数等问题。此外,还探讨了三角函数中的弧度与角度转换,字符串相加的原理,以及结构体初始化的特殊性。最后,文章提出了良好的变量初始化习惯,如在声明时初始化,特别是在类构造函数中初始化数据成员。
摘要由CSDN通过智能技术生成

1.两个字符串相加底层会生成StringBuilder对象(新建一个字符串),然后使用append来拼接,加法号前面的字符串在新字符串的首部。

2.十进制转二进制、八进制、十六进制,新取余得到的数是在最高位。

3.C++中sin,cos,tan这些三角函数操作的是弧度,而非角度
弧度=角度*Pi/180
弧度 = 弧长/半径,180°=π弧度

4.易错点: memset
memset是一个初始化函数,作用是将一块内存中的全部设置为指定的值
void *memset(void *s,int c,size_t n);
s指向要填充的内存块
c是要被设置的值
n是要被设置该值的字符数
返回类型是一个指向存储区s的指针
注意:
(1)不能任意赋值
memset函数是按照字节对内存块进行初始化,所以不能用它将int数组出初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。
其实c的实际范围应该在0~255,因为memset函数只能取c的后八位给所输入范围的每个字节。也就是说无论c多大只有后八位二进制是有效的。
(2)注意所要赋值的数组的元素类型
memset函数中只能取c的后八位赋给每个字节,数组是字符型的,字符型占据的内存大小就是1Byte,
而memset函数也是以字节为单位进行赋值的,所以可以赋予其他值。
(3)关于所要赋值的字符数的写法
当数组作为参数传递时,其传递的实际上是一个指针,这个指针指向数组的首地址,如果用sizeof(a)函数得到的只是指针的长度,而不是数组的长度。
解决方案:
在函数中加入数组长度参数,在传递前先获取数组长度,然后将数组长度作为参数传递进去。
(4)清空结构体类型的变量

typedef struct Stu{
	char name[20];
	int cno;
}Stu;
Stu stu1; 
memset(&stu1, 0 ,sizeof(Stu));

Stu stu2[10]; //数组
memset(stu2, 0, sizeof(Stu)*10);

此外,如果结构体中有数组的话还是需要对数组单独进行初始化处理的。

5.赋初值
(1)普通数组没有赋初值时,默认的数组元素值是随机数,不是0。
(2)字符数组的字符可以赋值整数的0,效果相当于结束标示符‘\0’:

#include<stdio.h>
#include<string.h>
int main()
{
	char s[]="Zhejiang";
	s[2]=0;
	printf("%lu %s",strlen(s),s);
	return 0;
}

结果是2和Zh。
(3)为了程序按照预想运行,未初始化或者赋值前,避免进行加减乘除等运算,应为系统分配的内存所存储的数据值是未知的,轻则运算出错,重则程序崩溃。

6.变量初始化原则
不恰当的变量初始化所导致的一系列问题都源于变量的默认值与你的预期值不同。以下行为都会产生此类问题:
(1)从未对变量赋值。它的值只是程序启动时变量所处内存区域的值。
(2)变量值已经过期。变量在某个地方曾经被赋值,但该值已经不再有效。
(3)变量的一部分被赋值,而另一部分没有。
最后一条有几种可能的情况。你可能初始化一个对象的部分成员,而不是全部成员。也可能忘记事先分配的内存,就去初始化一个未经初始化的指针所指的“变量”。这就意味着你是随机选取了一块内存,然后对其赋值。这块内存可能存放的是数据,也可能存放的是代码。甚至可能指向操作系统内部。指针操作错误可能产生很奇怪的现象,并且每次都不相同——这也导致了调试指针错误比调试其他错误更困难。
避免产生初始化错误的建议。
(1)在声明变量的时候初始化。
(2)在靠近变量第一次使用的位置初始化它。包括Visual Basic在内的一些语言不支持在声明变量的同时进行初始化。此时最好的做法是在尽可能靠近第一次使用变量的位置初始化该变量。
(3)理想情况下,在靠近第一次使用变量的位置声明和定义该变量。声明指定了变量的类型,定义为变量指定特定的取值。在允许这样做的语言,如C++和Java中,变量应该在靠近第一次使用的位置进行声明和定义。在理想情况下,每个变量都应该在声明的同时被定义。
(4)在可能情况下使用final或者const。
(5)特别注意计数器和累加器。i,j,k,sum和total等变量常用做计数器或累加器。下一次使用这些变量之前忘记重置其值也是一种常见错误。
(6)在类的构造函数里初始化该类的数据成员。子程序的变量应该在每一个子程序内部初始化,类的数据也应该在其构造函数中初始化。如果在构造函数里面分配了内存,那么就应该在析构函数中释放这些内存。
(7)检查是否需要重新初始化。或者由于子程序内的某个循环需要多次使用该变量,或者由于该变量会在多次子程序调用之间维持其值,因此需要在每次调用时重新赋值。如果的确需要重新初始化,那么要确保初始化位于那些重复执行的代码内部。
(8)一次性初始化具名常量:用可执行代码来初始化变量。
(9)使用编译器设置来自动初始化所有变量。
(10)利用编译器的警告信息。很多编译器会在你使用了未经初始化的变量的时候发出警告。
(11)检查输入参数的合法性。
(12)使用内存访问检查工具来检查错误的指针。
(13)在程序开始时初始化工作内存

7.extern声明的作用是:当编译器编译到这里时,它会告诉编辑器该变量是存在的,已在某个文件中定义,编译器就会顺利通过而不会产生变量未声明的错误。在链接阶段,这个C程序文件对应的目标代码就会查找所有文件中有这个变量定义的目标代码进行链接,如果找不到该变量的定义就会报链接错误。

8.在C/C++中数组声明和初始化的设定可以同时进行,也可以分开。
char a[3] = {1, 2, 3};这种方式赋值只能在定义的时候赋值。否则就只能a[0] = 1…这样一个个赋值了。

9.程序中断后,断点所在的行还没有执行。
设置断点后,即可运行程序。
当程序运行到断点时,程序中断执行,进入调试状态。
程序中断后,如果将鼠标放在希望观察执行过程的语句的变量上面,调试器就会自动显示执行到断点时该变量的值。多次选中变量,鼠标右键,点击添加监控,可以同时查看多个变量的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值