目录
一.const
二.assert
作用:
用来修饰变量,把变量修饰为常属性。就是让一个变量不可修改。
如何使用:
没加const的:
#include
int main()
{
int a = 0;
a = 2;
printf("%d\n", &a);
}
会输出2 ,这就是一个挺简单的代码哈。
加了const后:
#include
int main()
{
const int a = 0;
a = 2;//这里的a在编译器里面是编译不过去的,报错信息是:表达式必须是可修改的左值。
//也就是说const把a修饰为一个不可修改的量。
printf("%d\n", &a);
}
const用在指针上是有一点小讲究的
用在指针的*的左边和右边修饰的是不一样的,请看下文。
这是原本的代码,输出结果是 i 的值,也就是 1。
#include
int main()
{
int i = 1;
int* a=&i;
printf("%d\n", *a);
}
const 修饰在*号左边:
#include
int main()
{
int i = 1;
const int* a = &i;
*a = 2;//*a会变为不可修改的左值,与前面的的报错类似
printf("%d\n", *a);
}
#include
int main()
{
int i = 1;
int j = 2;
const int* a = &i;
a = &j;//但是修改a是没有任何问题的
printf("%d\n", *a);
}
所以const在*左边的时候修饰的是解引用的a也就是带*的a
而a本身还是可以正常使用的,并没有受const影响。
const在*右面的时候
#include
int main()
{
int i = 1;
int j = 2;
int* const a = &i;
a = &j;//放在这里a就会变为不可修改的左值
printf("%d\n", *a);
}
#include
int main()
{
int i = 1;
int* const a = &i;
*a = 2;但是这里的*a又可以正常使用了
printf("%d\n", *a);
}
所以const在*右边的时候a是被修改的所以不能正常使用
但是*a是可以正常使用的。
最后呢
总得来说,const在*左边修饰的是解引用的,也就是带*的,而不带*的可以正常使用
const在*右边修饰的是没被解引用的,也就是不带*的,所以带*的可以正常使用
也就是呢const在*左边修饰的是带*的,
const在*右边修饰的是不带*的。
头文件:
#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);
}
最后输出的结果是这样的:
其实就是错误所在的具体位置。
以上就是本次的分享,欢迎大家评论,指出错误或更好的方法。