首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

很多网上说go to语句不太规范,小弟我想问问使用这个函数要注意什么,哪位高手给个规范使用的小例子,求,最好贴点代码 要规范的

2012-04-05 
很多网上说go to语句不太规范,我想问问使用这个函数要注意什么,谁给个规范使用的小例子,急求,最好贴点代码

很多网上说go to语句不太规范,我想问问使用这个函数要注意什么,谁给个规范使用的小例子,急求,最好贴点代码 要规范的
RT

[解决办法]
没什么好的例子,最好不要用,能避免就避免,不然程序可读性差。。。容易出错。
[解决办法]
不要用就好了,这个还有例子吗
[解决办法]
如果当当说注意方面:就是要小心跳过某些变量的定义。而后面又在是用这个变量
例如

C/C++ code
int main(){   goto temp;   int a;   cin >> a;   temp:   cout << a;   return 0;}
[解决办法]
最好不要用!
我平时用到的goto也仅仅是在报错时,向下goto。向上goto时容易出问题。
当然,有人会说goto是高手用的。
[解决办法]
记得以前第一次做实训的时候,我们的指导老师还推荐用goto loop来着...

那时候用感觉还不错,毕竟是小程序
[解决办法]
goto语句被唾弃的原因就是因为他直接使用了跳转指令,让程序的执行顺序无法掌控。小程序容易控制,当程序代码多了,就容易出现顺序错乱了。而且goto语句使程序可读性差。
[解决办法]
goto语句本身就不“规范”

所谓的“规范”,就是控制程序的行为,通过限制程序员的选择来做到程序的可控
而goto语句可以随意跳转,代表除了写它的程序员之外,其他人很难看懂这个程序的结构和功能——甚至写它的程序员过段时间也看不懂了

现代的编程语言里有很多很多功能就是限制程序员能做的选择
比如const,比如强类型检查,比如封杀goto
你要用的话随便,到后来找不出各种异常错误甚至过段时间就看不懂自己写的代码,你自己负责就是了
[解决办法]
1. 是goto,不是go to。
2. goto不是函数。
[解决办法]
初学者就不要用goto
[解决办法]
我就觉得goto还蛮好用的啊。ls的朋友别一个个把这个说的很恐怖似的

只不过平时goto用的不是很多,而且用的时候也是要再三考虑后才会用。不然的确有时候程序的逻辑会有点乱。

goto一般用作当条件不满足时跳出多重循环或者出错时直接跳至错误处理部分,一般是在函数内跳转。
[解决办法]
探讨

我就觉得goto还蛮好用的啊。ls的朋友别一个个把这个说的很恐怖似的

只不过平时goto用的不是很多,而且用的时候也是要再三考虑后才会用。不然的确有时候程序的逻辑会有点乱。

goto一般用作当条件不满足时跳出多重循环或者出错时直接跳至错误处理部分,一般是在函数内跳转。

[解决办法]
内核里的代码用goto的还是比较多的,比如这段代码演示的就是goto比较“规范”的用法:
C/C++ code
/* callback routine to initialize 'struct slot' for each slot */int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot){    struct slot *slot;    int retval = -ENOMEM;    char name[SLOT_NAME_SIZE];    slot = kzalloc(sizeof(*slot), GFP_KERNEL);    if (!slot)        goto error;    slot->hotplug_slot = kzalloc(sizeof(*slot->hotplug_slot), GFP_KERNEL);    if (!slot->hotplug_slot)        goto error_slot;    slot->hotplug_slot->info = &slot->info;    slot->hotplug_slot->private = slot;    slot->hotplug_slot->release = &release_slot;    slot->hotplug_slot->ops = &acpi_hotplug_slot_ops;    slot->acpi_slot = acpiphp_slot;    slot->hotplug_slot->info->power_status = acpiphp_get_power_status(slot->acpi_slot);    slot->hotplug_slot->info->attention_status = 0;    slot->hotplug_slot->info->latch_status = acpiphp_get_latch_status(slot->acpi_slot);    slot->hotplug_slot->info->adapter_status = acpiphp_get_adapter_status(slot->acpi_slot);    acpiphp_slot->slot = slot;    snprintf(name, SLOT_NAME_SIZE, "%llu", slot->acpi_slot->sun);    retval = pci_hp_register(slot->hotplug_slot,                    acpiphp_slot->bridge->pci_bus,                    acpiphp_slot->device,                    name);    if (retval == -EBUSY)        goto error_hpslot;    if (retval) {        err("pci_hp_register failed with error %d\n", retval);        goto error_hpslot;     }    info("Slot [%s] registered\n", slot_name(slot));    return 0;error_hpslot:    kfree(slot->hotplug_slot);error_slot:    kfree(slot);error:    return retval;} 


[解决办法]
goto本身是个好东西,只是很早以前被滥用,结果导致后来被很多程序员唾弃。

到了结构化程序设计时期,goto已经不再是写程序的必须语句。但有很多程序里还是保留了它,因为适当的应用不但不会破坏程序结构,反而还能增进程序的可读性。

运用goto,需要严格遵循以下原则:

1、任何一个goto都不应该跳出所在的函数。
2、绝不能用goto从外跳入任何一个语句结构的内部。
3、goto距离不能太远,必须保证在一屏可见范围内。
4、绝不用goto构建循环。

其实剩下的就两个了:
用goto从语句结构内部跳出。在多层循环内使用效果非常好。
在极复杂的条件判断里减少重复条件的出现。

第二个还需要有经验的人去做,初学者很难掌握。
[解决办法]
goto例子:

C/C++ code
int fun1(int **A,int B,int C,int Idx){  int s=0  for(int i=0;i<B;++i)    for(int j=i,ii=0;ii<C;++ii,j++)      if(j==Idx){        s = (i*C+ii);        goto Done;}      else        s += j;Done:  if(s>=B*C)    s = 0;  return s;}
[解决办法]
我一般习惯用goto来直接跳到一个函数末尾的出错处理,比如下面的代码
C/C++ code
int func(int xxx, char *p){    FILE *fp = fopen(...);    if (xxx==1)goto FUNC_ERROR;//其他代码    if (*p = '\n')goto FUNC_ERROR;//其他代码    if ((char)xxx = *p)goto FUNC_ERROR;//其他代码FUNC_ERROR:close(fp);//其他出错处理代码return -1;}
[解决办法]
除了程序崩溃 其他的你就别用了
[解决办法]
探讨

内核里的代码用goto的还是比较多的,比如这段代码演示的就是goto比较“规范”的用法:
C/C++ code

/* callback routine to initialize 'struct slot' for each slot */
int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot)
{
……

[解决办法]
C++下面有throw,try catch。
C下面没有,有时不用goto还挺麻烦的。
[解决办法]
规矩是人定的,但人不能被规矩限制死。
规定不许随地大小便,也没见谁被大小便憋死过。

热点排行