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
发布了27 篇原创文章 · 获赞 4 · 访问量 4522

猜你喜欢

转载自blog.csdn.net/SGL_LGS/article/details/104597604