8个IF语句
8个IF语句,怎样变简单些?楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
原意是8个结构变量只要不为0,并且err_chl_date.chl_date的8个不同的位,置1为真,那么数组g_AckBuf的8个位分别置1.要不就为0
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x01)==0x01))
{
g_AckBuf|=0x01;
}
else {
g_AckBuf&=0xf7;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x02)==0x01))
{
g_AckBuf|=0x02;
}
else {
g_AckBuf&=0xfd;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x04)==0x01))
{
g_AckBuf|=0x04;
}
else {
g_AckBuf&=0xfb;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x08)==0x01))
{
g_AckBuf|=0x08;
}
else {
g_AckBuf&=0xf7;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x10)==0x01))
{
g_AckBuf|=0x10;
}
else {
g_AckBuf&=0xef;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x20)==0x01))
{
g_AckBuf|=0x20;
}
else {
g_AckBuf&=0xdf;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x40)==0x01))
{
g_AckBuf|=0x40;
}
else {
g_AckBuf&=0xbf;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x80)==0x01))
{
g_AckBuf|=0x80;
}
else {
g_AckBuf&=0x7f;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x01)==0x01))
{
g_AckBuf|=0x01;
}
else {
g_AckBuf&=0xf7;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x02)==0x02))
{
g_AckBuf|=0x02;
}
else {
g_AckBuf&=0xfd;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x04)==0x04))
{
g_AckBuf|=0x04;
}
else {
g_AckBuf&=0xfb;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x08)==0x08))
{
g_AckBuf|=0x08;
}
else {
g_AckBuf&=0xf7;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x10)==0x10))
{
g_AckBuf|=0x10;
}
else {
g_AckBuf&=0xef;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x20)==0x20))
{
g_AckBuf|=0x20;
}
else {
g_AckBuf&=0xdf;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x40)==0x40))
{
g_AckBuf|=0x40;
}
else {
g_AckBuf&=0xbf;
}
if((err_pra.err_name_date!=0) && ((err_chl_date.chl_date &= 0x80)==0x80))
{
g_AckBuf|=0x80;
}
else {
g_AckBuf&=0x7f;
} 可以变成一条赋值语句,效率也可以提高一点,但会变得难于理解
哦。。。。不行。
你的括弧里面有赋值,不能弄掉。。。 来个for循环。。。
#define MAX_NUM(unsigned char)0xff
#define CNT (unsigned char)0x08
const unsigned char Tab = {0x01, 0x02, 0x04 ,0x08, 0x10, 0x20, 0x40, 0x80};
unsigned char u8Loop = 0;
for (; u8Loop < CNT; u8Loop++)
{
if (0 != err_pra.err_name_date)
{
if (Tab== (err_chl_date.chl_date & Tab))
{
g_AckBuf |= ab;
}
else
{
g_AckBuf &= (MAX_NUM - ab);
}
}
else
{
g_AckBuf &= (MAX_NUM - ab);
}
} 高手啊,牛X
楼主写代码发现有很多代码重复的时候首先要考虑到的就是能不能用查表法,自己做个表通过索引值查表
for(int i=0;i<8;i++)
{
uin8_t mask = 1<<i;
if((err_pra.err_name_date != 0) && ((err_chl_date.chl_date &= mask) == 0x01))
{
g_AckBuf |= mask;
}
else
{
g_AckBuf &= ~mask;
}
}
用switch语句试试
或者看看有没有重复项合并下
当然可以了
if里边嵌套for就可以
if 嵌套for 然后在for里边嵌套if就行了
嵌套多了 会不会速度变慢
这种有规律的直接用查表法,和函数指针打包成一个结构体,代码清晰干净
好的,我明天去单位试一下,多谢各位大侠了哈
if少用,容易头晕
页:
[1]