goto
语句被称为 C 语言中的跳转语句。goto
语句一般很少使用,因为它使程序的可读性和复杂性变得更差。goto label;
goto-statment.c
,其代码如下所示:#include
void main()
{
int age;
gotolabel:
printf("You are not eligible to vote!\n");
printf("Enter you age:\n");
scanf("%d", &age);
if (age < 18)
{
goto gotolabel;
}
else
{
printf("You are eligible to vote!\n");
}
}
You are not eligible to vote!
Enter you age:
12
You are not eligible to vote!
Enter you age:
18
You are eligible to vote!
GOTO语句一直是批评和争论的目标,主要的负面影响是使用GOTO语句使程序的可读性变差,甚至成为不可维护的「面条代码」。
if-then-else
语句来替代 GOTO。迪杰斯特拉认为不加限制地使用GOTO语句应当从高级语言中废止,因为它使分析和验证程序正确性(特别是涉及循环)的任务变得复杂。
Structured Programming with go to Statements
[3]中,文章分析了许多常见编程任务,然后发现其中的一些使用GOTO将得到最理想的结构。break
和 continue
,它们都是有效地被限制的 goto 语句。/drivers/i2c/i2c-dev.c
中的i2c_dev_init
函数:static int __init i2c_dev_init(void)
{
int res;
pr_info("i2c /dev entries driver\n");
res = register_chrdev_region(MKDEV(I2C_MAJOR, 0), I2C_MINORS, "i2c");
if (res)
goto out;
i2c_dev_class = class_create(THIS_MODULE, "i2c-dev");
if (IS_ERR(i2c_dev_class))
{
res = PTR_ERR(i2c_dev_class);
goto out_unreg_chrdev;
}
i2c_dev_class->dev_groups = i2c_groups;
/* Keep track of adapters which will be added or removed later */
res = bus_register_notifier(&i2c_bus_type, &i2cdev_notifier);
if (res)
goto out_unreg_class;
/* Bind to already existing adapters right away */
i2c_for_each_dev(NULL, i2cdev_attach_adapter);
return 0;
out_unreg_class:
class_destroy(i2c_dev_class);
out_unreg_chrdev:
unregister_chrdev_region(MKDEV(I2C_MAJOR, 0), I2C_MINORS);
out:
pr_err("Driver Initialisation failed\n");
return res;
}
goto
语句,使用非常谨慎,基本都遵循上面提到的几个原则。这些嵌入式C语言代码,你不要错过了。
那些从一线撤回二三线城市的程序员们,最后都怎么样了?
做硬件,已经北漂七年了。。。
年底被裁,哭了三次