代码调试
调试基础
Debug:调试版本,包含调试信息,不作任何优化,便于调试程序。
Release:发布版本,进行了各种优化,使得程序在代码大小和运行速度上都是最优的。
快捷键 | 项目 | 功能 |
---|---|---|
F5 | 启动调试 | 直接跳到下一个断点处。 |
ctrl F5 | 开始执行 不调试 | 直接运行程序而不调试 |
F9 | 创建断点 | 设置断点, 使程序在想要的位置随意停止执行。可以设置条件 |
F10 | 逐过程 | 处理一个过程,一次函数调用,一条语句。 |
F11 | 逐语句 | 每次执行一条语句,可以进入函数内部。 |
shift F11 | 跳出 | 跳出函数 |
如何写出好(易于调试)的代码
eg:模拟strcpy()
char *strcpy( char *strDestination, const char *strSource );
int main()
{
char arr1[] = "hello ruarua";
char arr2[20] = { 0 };
strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
strcpy() returns the destination string
int main()
{
char arr1[] = "hello ruarua";
char arr2[20] = { 0 };
printf("%s", strcpy(arr2, arr1));
return 0;
}
my_strcpy(char * dest, char * src )
#include<assert.h>
void my_strcpy(char* dest, char* src)
{
while (*src)// \0的ASCII==0
{
//断言
assert(dest != NULL);//内部放不希望发生的事情
assert(src != NULL);
*dest = *src;
dest++;
src++;
}
*dest = *src;//copy \0
}
优化1:
void my_strcpy(char* dest, char* src)
{
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++)
;//空语句
}
优化2:
char* my_strcpy(char* dest, char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++)
;//空语句
return ret;
}
优化3:
char* my_strcpy(char* dest, const char* src)//const 常属性
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++)
;
return ret;
}
int main()
{
char arr1[] = "hello ruarua";
char arr2[20] = { 0 };
int* p = NULL;
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
printf("%s\n", my_strcpy(arr2,arr1));
return 0;
}
const
const int n = 1000;
//n = 20; 无法更改,因为n具有了常属性
int* p = &n;
*p = 20;
//可以改变n,但是依然非法
conest int* p = &n;//补救