user-0 提问: C语言新手，写了一段代码用了很多goto语句。（不用goto感觉很复制），想请教一下大神遇到这种情况到底用不用goto。

回复:
user: user-1
content: http://bbs.csdn.net/topics/380157851

user: user-2
content: 现在有个疑问，你的 case2 和 case3 里面，那个 printf 之后不返回 0 吗？如果不返回，打出结果还继续的话，你这个逻辑不用 goto 很麻烦，只能少用。如果你那里的确是有 return 0 只是忘了写，那这个逻辑太容易实现了。

user: user-3
content: goto是無條件跳轉，在沒有if的時候用來獲得if的效果，現在沒必要用 goto會導致程序的可讀性變差，而且你很難考慮到發生跳轉時的所有可能，導致發生預料之外的錯誤 仍然有一些使用goto的好的例子，但是在你確信可以完全控制局面之前不要使用goto

user: user-4
content: 1个goto也别用，如果你依然用GOTO 你的二维思维就别想那么快上升到三维甚至多维  一个程序，必然是一个多维思维的结果  你感觉复杂，是用二维思维去考虑多维的结果  似想，用多维思维去思考多维怎么会复杂呢？ 所以，别去纠结了  我只告诉你，任何需要GOTO去达到的效果，都一定存在恰当的方式方法替代GOTO

user: user-5
content: 除了goto case7出现2次外，其他goto都只出现1次，完全可以用if else来是实现啊

user: user-1
content: 过早的优化是万恶之源。

user: user-6
content: 写成接口不是更方便吗

user: user-7
content: 如果只是考虑当前的问题，goto还是很清晰的。  但是如果要做些修改，比如调整跳转，或者生成新的决策树，那么代码就不那么好维护了。  抛砖引玉吧：   # include <stdio.h>  struct Node;  enum NodeType {     question,     terminator, };  struct Option {     char * option;     struct Node * next; };  struct Node {     enum NodeType type;     char * question;     struct Option options[10];     char * result; };  int main() {     struct Node q1 = {         question,         "你想要多大尺寸的机型？",         {             { "13寸以下（极度便携)" },             { "13~15寸 （主流均衡)" },             { NULL, NULL }         },         NULL     },          q2 = {         question,         "是否愿意使用可拆分的PC平板二合一产品？",         {             { "是，我愿意" },             { "否，不愿意" },             { NULL, NULL }         },         NULL     },          q3 = {         question,         "你的主要用途（常用软件）是什么？",         {             { "网页浏览、Office、PDF Reader、Coding" },             { "制图、工业软件、其他对性能有要求的应用" },             { "需要 wacom 电磁屏的设计绘图行业" },             { NULL, NULL }         },         NULL     },          q4 = {         question,         "是否需要专为触摸设计的不可拆分笔记本？",         {             { "是，我需要" },             { "否，不需要" },             { NULL, NULL }         },         NULL     },          q5 = {         question,         "是否有一定的游戏需求？",         {             { "是，我偶尔会玩一些轻度游戏或者不玩（LOL、Dota、COD4、尘埃3)" },             { "是，玩大部分3D网游和非发烧单机游戏（剑灵、WOW、Dota2、COD）" },             { NULL, NULL }         },         NULL     },          q6 = {         question,         "是否属于需要 Nvidia Quadro 专业显卡的领域？（Quadro行业应用)",         {             { "是，我需要" },             { "否，不需要" },             { NULL, NULL }         },         NULL     },          q7 = {         question,         "是否属于需要高性能CPU的领域？（例如大量数据处理、虚拟机）",         {             { "是，要求很高" },             { "否，要求不高" },             { NULL, NULL }         },         NULL     },          q8 = {         question,         "有哪些必备的接口或装置？",         {             { "USB+HDMI+耳麦合一接口" },             { "除上述之外还需要VGA、网线接口" },             { NULL, NULL }         },         NULL     },          t1 = {         terminator,         NULL,         { },         "1. X1 Helix\n2. ThinkPad 10"     },          t2 = {         terminator,         NULL,         { },         "1. S1 Yoga、Helix\n2. ThinkPad 10"     },          t3 = {         terminator,         NULL,         { },         "S1 Yoga"     },          t4 = {         terminator,         NULL,         { },         "1. X250\n2. X1 Carbon系列"     },          t5 = {         terminator,         NULL,         { },         "1. T450\n2. S Yoga系列"     },          t6 = {         terminator,         NULL,         { },         "1. W541\n2. W550"     },          t7 = {         terminator,         NULL,         { },         "T450、T550的i7版本"     },          t8 = {         terminator,         NULL,         { },         "1. X1 Carbon系列\n2. S3 Yoga"     },          t9 = {         terminator,         NULL,         { },         "T450s、T450"     };     struct Node * node;      q1.options[0].next = &q2;     q1.options[1].next = &q3;      q2.options[0].next = &t1;     q2.options[1].next = &q4;      q3.options[0].next = &q5;     q3.options[1].next = &q6;     q3.options[2].next = &t2;      q4.options[0].next = &t3;     q4.options[1].next = &t4;      q5.options[0].next = &q7;     q5.options[1].next = &t5;      q6.options[0].next = &t6;     q6.options[1].next = &q7;      q7.options[0].next = &t7;     q7.options[1].next = &q8;      q8.options[0].next = &t8;     q8.options[1].next = &t9;      node = &q1;     while (node)     {         puts("");         if (node->type == question)         {             puts(node->question);              struct Option * option = node->options;             int i = 0;             while (option->option)             {                 printf("%d. ", i++);                 puts(option++->option);             }              scanf("%d", &i);              node = node->options[i].next;         }         else         {             puts(node->result);             node = NULL;         }     }      return 0; }

user: user-8
content: 建议把各个部分封装成函数，然后直接调用即可，通常都可以用判断与循环代替掉，一样可以做到不是你说的那种“很复制”

user: user-2
content: 如果你的每个型号列表那里都有 return 0，你的代码可以调整一下。 注意这个问题：是否有一定的游戏需求？A、B 被我互换了，为方便逻辑书写：#include <stdio.h> #include <conio.h>  int main() { 	char t; 	printf( "你想要多大尺寸的机型？\n" 			"A. 13寸以下（极度便携)\n" 			"B. 13～15寸（主流均衡)\n" ); 	t = getch(); 	if (t == 'a' || t == 'A') 	{ 		printf( "是否愿意使用可拆分的PC平板二合一产品？\n" 				"A. 是，我愿意\n" 				"B. 否，不愿意\n" ); 		t = getch(); 		if (t == 'a' || t == 'A') 		{ 			printf( "1. X1 Helix\n" 					"2. ThinkPad 10\n" ); 			return 0; 		}  		printf( "是否需要专为触摸设计的不可拆分笔记本？\n" 				"A. 是，我需要\n" 				"B. 否，不需要\n" ); 		t = getch(); 		if (t == 'a' || t == 'A') 		{ 			printf( "1. S1 Yoga" ); 			return 0; 		} 		else 		{ 			printf( "1. X250\n" 					"2. X1 Carbon系列\n"); 			return 0; 		} 	}  	printf( "你的主要用途 (常用软件) 是什么？\n" 			"A. 网页浏览、Office、PDF Reader、Coding\n" 			"B. 制图、工业软件、其他对性能有要求的应用\n" 			"C. 需要 wacom 电磁屏的设计绘图行业\n" ); 	t = getch(); 	if (t == 'a' || t == 'A') 	{ 		printf( "是否有一定的游戏需求？\n" 				"A. 是，玩大部分3D网游和非发烧单机游戏 (剑灵、WOW、Dota2、COD)\n" 				"B. 是，我偶尔会玩一些轻度游戏或者不玩 (LOL、Dota、COD4、尘埃3)\n" ); 		t = getch(); 		if (t == 'a' || t == 'A') 		{ 			printf( "1. T450\n" 					"2. S Yoga 系列\n" ); 			return 0; 		} 	} 	else if (t == 'b' || t == 'B') 	{ 		printf( "是否属于需要 Nvidia Quadro 专业显卡的领域(Quadro 行业应用)？\n" 				"A. 是，我需要\n" 				"B. 否，不需要\n" ); 		t = getch(); 		if (t == 'a' || t == 'A') 		{ 			printf( "1. W541\n" 					"2. W550\n" ); 			return 0; 		} 	} 	else 	{ 		printf( "1. S1 Yoga、Helix\n" 				"2. ThinkPad 10\n"); 		return 0; 	}  	printf( "是否属于需要高性能CPU的领域 (例如大量数据处理、虚拟机)？\n" 			"A. 是，要求很高\n" 			"B. 否，要求不高\n" ); 	t = getch(); 	if (t == 'a' || t == 'A') 	{ 		printf("T450、T550 i7 版本"); 		return 0; 	}  	printf( "有哪些必备的接口或装置？\n" 			"A. USB + HDMI + 耳麦合一接口\n" 			"B. 除上述之外还需要 VGA、网线接口\n" ); 	t = getch(); 	if (t == 'a' || t == 'A') 	{ 		printf( "1. X1 Carbon系列\n" 				"2. S3 Yoga\n" ); 		return 0; 	} 	else 	{ 		printf("T450/T450s"); 		return 0; 	}  	return 0; }

user: user-0
content: 不好意思，是复杂，不是复制，题目打错了。