程序代码优化,大家看看

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

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

上面的doX()其实是一大段长的代码,我不想写成函数。所以怎么样才能使上面的doX()只出现一次,或者少出现一次也行..不知道行不行..
...全文
122 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要干嘛?
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

65,210

社区成员

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

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