C++ 学习中的杂项易错易忘笔记

本文深入探讨了编程中的关键技巧,包括取整方法的差异、宏定义与子函数的区别、字符数组长度的处理以及二维数组指针操作的多种方式。通过具体实例解析,帮助读者掌握这些核心概念。

疫情所迫,希望用这种方法督促自己坚持学习。同时记录在找工作过程中的艰辛不易。博客内容持续增减修改,都为摘录和个人理解。欢迎各位批评指正其中错误,相互勉励,共同进步。

1、取整的几种方法比较

//ceil向上取整
ceil(1.4) = 2          
ceil(-1.4) = -1
//floor向下取整
floor(1.4) =1          
floor(-1.4) = -2
//int强制类型转换 注意和floor区别
int(1.4) = 1           
int(-1.4) = -1
//fix始终朝向0取整
fix(1.4) = 1           
fix(-1.4) = -1
//四舍五入
round(1.4) = floor(1.4+0.5) = 1    
round(-1.4) = floor(-1.4+0.5) = -1

不论哪种取整方法需要特别注意正数和负数的区别

2、宏定义和定义子函数的区别
#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。定义宏只用于替换替换替换,请分析下面代码:

#define ADD(x) x+x

int add(int x) {
	return x + x;
}

void main()
{
	int m = 1, n = 2, k = 3;
	int sum1 = ADD(m + n)*k;                //等价于sum1=m+n+m+n*k=10
	int sum2 = add(m + n)*k;                //等价于sum2=(m+n+m+n)*k=18
	printf("sum1=%d sum2=%d", sum1,sum2);
}

3、字符数组的长度问题
strlen作用是返回字符串中长度,对于strlen(a)=3。但是对于字符串数组,strlen默认的搜索结束标志是要查找到“\0”,否则会沿着内存不停地查找直到遇到“\0”。因此strlen(b)无法确定。c++中我们更多的时候利用string类型变量来消除影响。

char a[] = "xyz", b[] = {'x', 'y', 'z'};
if (strlen(a) > strlen(b))
    printf("a > b\n");
else
    printf("a <= b\n");         //应该返回改值

4、二维数组的指针表示几种情况
在数组中我们可以利用下标访问数组中的对应元素。同样也可利用指针实现上述操作。但是存在如下三种易混淆的情况。

  • 定义的p1指针中,先对二维数组名取地址,再加一,就表示下一个二维数组所在的地址;
  • 定义的p2指针中,代表下一行的地址;
  • 定义的p3指针中,a[0] + 1 = a[0][1];
int a[][5] = { {0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14} };
int *p1 = (int*)(&a + 1);
int *p2 = (int*)(a + 1);
int *p3 = (int*)(a[0] + 1);
cout << *(p1 - 3) << " " << *p2 << " " << *p3 << endl;  //输出为12 5 1
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值