目录
一.const
二.assert
一.const
作用:
用来修饰变量,把变量修饰为常属性。就是让一个变量不可修改。
如何使用:
没加const的:
#includeint main() { int a = 0; a = 2; printf("%dn", &a); }
会输出2 ,这就是一个挺简单的代码哈。
加了const后:
#includeint main() { const int a = 0; a = 2;//这里的a在编译器里面是编译不过去的,报错信息是:表达式必须是可修改的左值。 //也就是说const把a修饰为一个不可修改的量。 printf("%dn", &a); }
const用在指针上是有一点小讲究的
用在指针的*的左边和右边修饰的是不一样的,请看下文。
这是原本的代码,输出结果是 i 的值,也就是 1。
#includeint main() { int i = 1; int* a=&i; printf("%dn", *a); }
const 修饰在*号左边:
#includeint main() { int i = 1; const int* a = &i; *a = 2;//*a会变为不可修改的左值,与前面的的报错类似 printf("%dn", *a); }
#includeint main() { int i = 1; int j = 2; const int* a = &i; a = &j;//但是修改a是没有任何问题的 printf("%dn", *a); }
所以const在*左边的时候修饰的是解引用的a也就是带*的a
而a本身还是可以正常使用的,并没有受const影响。
const在*右面的时候
#includeint main() { int i = 1; int j = 2; int* const a = &i; a = &j;//放在这里a就会变为不可修改的左值 printf("%dn", *a); }
#includeint main() { int i = 1; int* const a = &i; *a = 2;但是这里的*a又可以正常使用了 printf("%dn", *a); }
所以const在*右边的时候a是被修改的所以不能正常使用
但是*a是可以正常使用的。
最后呢
总得来说,const在*左边修饰的是解引用的,也就是带*的,而不带*的可以正常使用
const在*右边修饰的是没被解引用的,也就是不带*的,所以带*的可以正常使用
也就是呢const在*左边修饰的是带*的,
const在*右边修饰的是不带*的。
二.assert
头文件:
#include
作用:用来发现bug并报出bug位置
如何使用:
assert();//在括号中写入表达式,表达式结果为假会报出bug位置。
例子:
下面是一个写好的没问题的代码,
#include#include char* my_strcpy(char* a,const char* b)//这是一个模拟的strcpy函数 { assert(a && b);//这是assert的作用位置,可以看到a和b是两个指针相与表示a或b中有空指针表 //达式的结果为0 char* c = a; while (*a++ = *b++) { ; } return c; } int main() { char a[] = { "############" }; char b[] = { "abc" }; my_strcpy(a, b); puts(a); }
为了演示assert的作用和使用我们吧上面代码的b字符数组改成空指针。
#include#include char* my_strcpy(char* a,const char* b) { assert(a && b); char* c = a; while (*a++ = *b++) { ; } return c; } int main() { char a[] = { "############" }; char* b = NULL; my_strcpy(a, b); puts(a); }
最后输出的结果是这样的:
其实就是错误所在的具体位置。
assert()断言在release版本是会被优化掉的。
以上就是本次的分享,欢迎大家评论,指出错误或更好的方法。



