c语⾔,goto⽤法,goto最强使⽤⽅法
1:先说goto的基本语法
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 1;
while(1)
{
printf("在while(1)⾥\n");
while(i++)
{
printf("i = %d\n",i);
if(i > 3)
{
goto TiaoChu;
}
}
}
TiaoChu:
printf("程序结束\n");
return 0;
}
运⾏结果:
标号位置
在while(1)⾥
2
3
4
程序结束
从运⾏结果我们明显可以知道goto⽤法,可以跳出多重循环,标号只是标号,程序到标号位置正常执⾏。
2:goto语句有啥⽑病,goto来回这么跳,在程序庞⼤后,在调试时很难到错误,所以E.W.Dijikstra在1965年提出结构化程序设计来规避这种错误,也使得代码更容易阅读。
3:goto容易出错,但其仍然有存在的价值,在单个函数中使⽤goto基本不可能出错,goto在程序反操作上很好⽤
//函数成功返回1,失败返回0
int fun()
{
FIL *a,*b;//⽂件体
char *c,*d;
a = fopen("***");
if(a = NULL) return 0;
c = malloc(1000);
if(c = NULL) goto _q1;
b = fopen("***");
if(b = NULL) goto _q2;
d = malloc(1000);
if(d =NULL) goto _q3;
return 1;
q3:
fclose(b);
q2:
free(c);
q1:
fclos(a);
return 0;
}
这种⽅式很⽅便的进⾏了反操作,⽽不⽤重复的去⼏次反操作。我的实际例⼦:
/*
*函数功能:返回图⽚信息结构体p_inf
* 参数:图⽚路径字符串picture_file_path
* 返回值:返回图⽚信息,NULL时为读取图⽚信息失败
* 作者:杨康
*/
p_inf *readPicInf(char *pfilepath)
{
c语言char的用法FIL fileDescriptor;//⽂件体或者称⽂件描述符
uint32_t readByteResult;//作为f_read的最后⼀个参数,接受读到了多少个字节
char fOptResult;//接受⽂件操作返回值(也就是返回结果)
p_inf *infReturn;//图⽚信息结构体,最后作为返回值
fOptResult = f_open(&fileDescriptor, (const TCHAR*)pfilepath, FA_READ);
if ((fOptResult != FR_OK) || (fileDescriptor.obj.objsize > BMPMEMORYSIZE)) return NULL;
infReturn = (p_inf *)malloc(sizeof(p_inf));
if (infReturn == NULL) goto INFRETURN_MALLOC_ERR;
infReturn->pfilestring = (char *)malloc(fileDescriptor.obj.objsize);
if (infReturn->pfilestring == NULL) goto INFRETURN_PFILESTRING_MALLOC_ERR;
fOptResult = f_read(&fileDescriptor,infReturn->pfilestring,fileDescriptor.obj.objsize, (UINT *)&readByteResult); if ((fOptResult != FR_OK) || (readByteResult != fileDescriptor.obj.objsize)) goto F_READ_ERR;
infReturn->pfilesize = fileDescriptor.obj.objsize;
f_close(&fileDescriptor);
return infReturn;
F_READ_ERR:
free(infReturn->pfilestring);
INFRETURN_PFILESTRING_MALLOC_ERR:
free(infReturn);
INFRETURN_MALLOC_ERR:
f_close(&fileDescriptor);
return NULL;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论