程序代码优化,大家看看

qyh1211 2009-03-13 05:33:40
类似这样的代码:

if(flagA)
{
doX();
}
else
{
if(flagB)
{
whlie(flagC)
{
doY();
doX();
}
}
else
{
doZ();
doX();
}
}

上面的doX()其实是一大段长的代码,我不想写成函数。所以怎么样才能使上面的doX()只出现一次,或者少出现一次也行..不知道行不行..
...全文
123 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
KevinYuen 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 chin_chen 的回复:]
再来一个
C/C++ code
if(flagA)
{
myflag=1;//加一个标志符
}
else
{
if(flagB)
{
if(flagC)
{
myflag=2;//加一个标志符

}
}
else
{
myflag=3;//加一个标志符

}
}


{


if(myflag==2)
{
doY;
}
if(myflag==3)
{
doZ();
}
if(myflag==1)
;
doX();
}…
[/Quote]

太多次的判断
chin_chen 2009-03-13
  • 打赏
  • 举报
回复
再来一个

if(flagA)
{
myflag=1;//加一个标志符
}
else
{
if(flagB)
{
if(flagC)
{
myflag=2;//加一个标志符

}
}
else
{
myflag=3;//加一个标志符

}
}


{


if(myflag==2)
{
doY;
}
if(myflag==3)
{
doZ();
}
if(myflag==1)
;
doX();
}while(flagC&&myflag==2)
dongpy 2009-03-13
  • 打赏
  • 举报
回复
列出flagA、flagB、flagC的真值表:
A B C doX
0 0 0 1
0 0 1 1
0 1 0 0
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 1
1 1 1 1
可见除了(!A&&B&&!C),都执行doX,因此简化:
if( A||!B||C )
{
do
{
doX();
if( A||!B )
break;
}whlie(flagC);
}
if( A||!B )
{
whlie(flagC)
{
doY();
}
}
if( !A&&!B )
{
doZ();
}
KevinYuen 2009-03-13
  • 打赏
  • 举报
回复

if( !a && !b )
{
doZ();
}

if( !b )
{
doX();
}
else
{
while( c )
{
doY();
doX();
}
}
liusichen_0 2009-03-13
  • 打赏
  • 举报
回复
这个不能叫代码优化,只能说是简化代码
chin_chen 2009-03-13
  • 打赏
  • 举报
回复
myflag初始为0
chin_chen 2009-03-13
  • 打赏
  • 举报
回复
if(flagA)
{
//移出去
}
else
{
if(flagB)
{
whlie(flagC)
{
myflag=1;//加一个标志符
doY();
doX();
}
}
else
{
doZ();
//移出去
}
}

if(myflag!=1)//这个就可以了
doX();
ctan 2009-03-13
  • 打赏
  • 举报
回复
楼上代码都不行,

建议楼主将doX()部分代码写到一个.h文件中, 在需要调用的地方用#include包含进去
chin_chen 2009-03-13
  • 打赏
  • 举报
回复
if(flagA)
{
//移出去
}
else
{
if(flagB)
{
whlie(flagC)
{
doY();
doX();
}
}
else
{
doZ();
//移出去
}
}

if(!flagC)//刚刚以为是互斥的。那这里用这个就行了撒
doX();
ctan 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chin_chen 的回复:]
C/C++ code
if(flagA)
{
//移出去
}
else
{
if(flagB)
{
whlie(flagC)
{
doY();
doX();
}
}
else
{
doZ();
//移出去
}
}

if(!flagB)
doX();
[/Quote]

有问题, 如果条件为(flagA)&&(flagB)时, 出现错误!
chin_chen 2009-03-13
  • 打赏
  • 举报
回复

if(flagA)
{
//移出去
}
else
{
if(flagB)
{
whlie(flagC)
{
doY();
doX();
}
}
else
{
doZ();
//移出去
}
}

if(!flagB)
doX();
Qlaiaqu 2009-03-13
  • 打赏
  • 举报
回复
我看来,这个已经是最简化的了

if(flagA)
{
doX();
}
else
{
if(flagB)
{
whlie(flagC)//这里的循环就导致了doX();不能放到外边去,因为难以保证调用次数,不过你要是贴出全部代码,可能还能改一下,否则变数大了
{
doY();
doX();
}
}
else
{
doZ();
doX();
}
}

lingyin55 2009-03-13
  • 打赏
  • 举报
回复
随便写一个,没有检查


if(flagB)
{
whlie(flagC)
{
doY();
doX();
}
}
else
{
if( !flagA )
{
doZ();
}
doX();
}
lin_style 2009-03-13
  • 打赏
  • 举报
回复
啊啊啊 。
没看到while..我错了。。


if(flagA)
{
//取消
}
else
{
if(flagB)
{
whlie(flagC)
{
doY();
doX();
}
}
else
{
//取消
doZ();
}
}

doX();//放这


应该行得了吧。。
tangshuiling 2009-03-13
  • 打赏
  • 举报
回复

如果dox、doy、doxz模块之间无任何耦合性,可单独把dox函数提到if语句块外,if快内的dox统统不要
Qlaiaqu 2009-03-13
  • 打赏
  • 举报
回复
有意思
lin_style 2009-03-13
  • 打赏
  • 举报
回复
错了。
因为你
第一个IF配套的ELSE里 doX()必须要执行一次,可以放出来。如果你的doX()和doY()之流关联不大的话,完全可以只执行一次。当然,要看你的doY的函数怎么写了
if(flagA)
/*
这种就算和doY,doX有关系也可以减少一次。
*/
{
doX();
}
else
{
if(flagB)
{
whlie(flagC)
{
doY();
}
}
else
{
doZ();
}
doX();
}
lin_style 2009-03-13
  • 打赏
  • 举报
回复
if(flagA)
{
doX();
}
else
{
if(flagB)
{
whlie(flagC)
{
doY();
}
}
else
{
doZ();
}
doX();
doX();
}

太乙 2009-03-13
  • 打赏
  • 举报
回复
什么叫只出现一次??

这跟代码优化没关系吧??

lz是想减少代码量???

函数调用反而会让效率下降(一般情况下)因为涉及到堆栈、断点、现场保存等@!

不懂lz要干嘛?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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