const修饰变量与assert断言详解

文章目录

    • const修饰变量
    • assert断言


const修饰变量

作用:const用于修饰变量使其不能再被修改。

修饰一般的变量

形式:放在类型的前面或者类型与变量之间
如:

int const a = 10;
const int b = 20;

那当我们还要改变a,b的值时,会发生什么呢
如:

 int const a = 10;
 const int b = 20;
a = 20;
b = 10;

运行:
const修饰变量与assert断言详解_第1张图片
结果就是编译器报错,运行失败。

修饰指针变量
那么const又是如何修饰指针变量的呢。
当const放在指针变量类型的前面时(即 const int *p),修饰的是 * p,
当const放在指针变量类型和( * )之间时(即 int const *p),修饰的是 * p,
当const放在( * )后面时(即 int * const p),修饰的是 p

const  int* p = &a;//修饰的是*p
int const* p = &a; //修饰的是* p
int* const  p = &a//修饰的是  p

说明:p 是用于存放a的地址的,而*p是用于改变a的值的,可以简单的理解为

p==&a
*p==a

通过代码加深理解:
第一种情况:
const修饰变量与assert断言详解_第2张图片
这里看出 *p 已经不能被修改了,那么 p 呢,接下来再看看
const修饰变量与assert断言详解_第3张图片
地址发生了改变,也就是p能改变
这里说明了:当const放在指针变量类型的前面时(即 const int *p),修饰的是 * p,而不是 p。
第二种情况和第一种是一样的,只是位置不一样

第三种情况
const放在( * )后面
const修饰变量与assert断言详解_第4张图片
这里报错了,p不能被修改,那么*p呢,接下来看看:
const修饰变量与assert断言详解_第5张图片
由图看出a的值改变了,说明:当const放在( * )后面时(即 int * const p),修饰的是 p

*总结:当const在 (*)前时,修饰的是 p, 当const在( * )后面时,修饰的是 p

assert断言

作用:验证一个条件是否正确,如果正确则跳过,正常执行后面的代码,否则就会报错,报错的同时告诉你在哪个文件,哪行,这是非常方便的函数,使调试的效率提升。
我们还可以用宏定义控制它开和关闭,当不用了就加宏,用时就注释掉宏

#define NDEBUG

头文件:assert的头文件是 < assert.h > .
使用

assert(条件)

例:

#include
int main() {

	int a = 12;
	assert(a < 0);
	printf("%d\n", a);
	return 0;
}

a大于0不符合条件,此时assert就会断言(报错),告诉你错的是哪里。
在这里插入图片描述

当我们用宏来关闭他时

#define NDEBUG
#include
int main() {

	int a = 12;
	assert(a < 0);
	printf("%d\n", a);
	return 0;
}

结果:
const修饰变量与assert断言详解_第6张图片
成功执行了

你可能感兴趣的:(c语言主要知识点,c语言,笔记,经验分享)