这种情况是不是只能用Goto

flyrack 2013-03-04 03:13:09
比如我有一些重复的代码块 比如代码A 代码B
我有一个
int j;
switch(i){
case 1:
j=10;
代码A;
break;
case 2:
j=20;
代码A;
break;
case 3:
j=30;
代码A;
break;
case 10:
j=100;
代码B;
break;
case 20:
j=200;
代码B;
break;
case 30:
j=300;
代码B;
break;
}
...全文
130 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zilaishuichina 2013-03-04
  • 打赏
  • 举报
回复
switch(i){ case 1: case 2: case 3: 代码A; break; case 10: case 20: case 30: 代码B; break; } 代码A: switch(i){ case 1: j=1; break; case 2: j=2; break; case 3: j=3; break; } 代码B: switch(i){ case 10: j=10; break; case 20: j=20; break; case 30: j=30; break; }
stereoMatching 2013-03-04
  • 打赏
  • 举报
回复
引用 6 楼 flyrack 的回复:
问题是实际代码是生成各种不同类型的类 不是赋值
我不知道factory pattern是否适合解决你的问题 你可以上网找一找简单的例子 http://en.wikipedia.org/wiki/Factory_method_pattern 如果需要复用性高,而且可以customize的factory modern c++ design的8,9章有很不错的实作
赵4老师 2013-03-04
  • 打赏
  • 举报
回复
引用 9 楼 palm008 的回复:
C/C++ code?123456789101112131415int j;switch(i){case 1:case 2:case 3: j=i*10; 代码A;break;case 10:case 20:case 30:j=i*100;代码B;break;}
代码B前面应为j=i*10;
palm008 2013-03-04
  • 打赏
  • 举报
回复
int j;
switch(i){
case 1:
case 2:
case 3:
 j=i*10;
 代码A;
break;
case 10:
case 20:
case 30:
j=i*100;
代码B;
break;
}
「已注销」 2013-03-04
  • 打赏
  • 举报
回复
可以用MFC消息循环中的分发函数用的方法来做
int j;

struct _vTableFunc{
	int ival;
	int idata;
	int funcNum;
} vtable[] = 
{	
	1, 10, 1,
		2, 20, 1,
		3, 30, 1,
		10, 100, 2,
		20, 200, 2,
		30, 300, 2,
		40, 400, 3,
		50, 500, 3,
		0, 0, 0, // 如果没有匹配数据,则全为0
};

int k=0;
for (k=0; k<sizeof(vtable)/sizeof(struct _vTableFunc)-1; k++)
{
	if (vtable[k].ival == i)
	{
		j = vtable[k].idata;
		break;
	}
}
if (vtable[k].funcNum == 1)
{
	// 代码A;
}
else if(vtable[k].funcNum == 2)
{
	// 代码B;
}
else if (vtable[k].funcNum == 3)
{
	//  代码C;
}
赵4老师 2013-03-04
  • 打赏
  • 举报
回复
引用 4 楼 turingo 的回复:
尽量不用goto语句,你的例子中可以这样: C/C++ code?12345678910switch(i){case 1:case 2:case 3: j = i * 10; 代码A; break;...}
支持!
switch(i)
{
case 1:
case 2:
case 3:
    j = i * 10;
    代码A;
    break;
case 10:
case 20:
case 30:
    j = i * 10;
    代码B;
    break;
}
flyrack 2013-03-04
  • 打赏
  • 举报
回复
问题是实际代码是生成各种不同类型的类 不是赋值
lin5161678 2013-03-04
  • 打赏
  • 举报
回复
switch(i){ case 1: case 2: case 3: case 10: case 20: case 30: j=i*10; 代码B; break; } 或者函数调用 或者宏展开 等等 各种方式 当然goto也可以
图灵狗 2013-03-04
  • 打赏
  • 举报
回复
尽量不用goto语句,你的例子中可以这样:

switch(i)
{
case 1:
case 2:
case 3:
    j = i * 10;
    代码A;
    break;
...
}
flyrack 2013-03-04
  • 打赏
  • 举报
回复
int j;
switch(i){
case 1:
j=10;
goto A;
case 2:
j=20;
goto A;
case 3:
j=30;
A:代码A;
break;
}
这样子
bravery36 2013-03-04
  • 打赏
  • 举报
回复
你就不能根据switch的结果再决定是A或B吗,在我看来goto目前的最大作用还是跳出多重循环,其他场合都有不错的代用品。
starytx 2013-03-04
  • 打赏
  • 举报
回复
代码A和B有什么特点?你的goto打算加在什么地方?

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧