wenfen 发表于 2022-6-11 15:30

8个IF语句

8个IF语句,怎样变简单些?

chuxh 发表于 2022-6-11 15:32

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

wenfen 发表于 2022-6-11 15:34

原意是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;
                                                                     }

wenfen 发表于 2022-6-11 15:36


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;
                }

shimx 发表于 2022-6-11 15:39

可以变成一条赋值语句,效率也可以提高一点,但会变得难于理解

kangzj 发表于 2022-6-11 15:41


哦。。。。不行。
你的括弧里面有赋值,不能弄掉。。。

chuxh 发表于 2022-6-11 15:44

来个for循环。。。

xxrs 发表于 2022-6-11 15:46


#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);
      }      
}

wenfen 发表于 2022-6-11 15:48

高手啊,牛X

kangzj 发表于 2022-6-11 15:50

楼主写代码发现有很多代码重复的时候首先要考虑到的就是能不能用查表法,自己做个表通过索引值查表

diweo 发表于 2022-6-11 15:50

        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;
                }               
        }

renyaq 发表于 2022-6-11 15:53


用switch语句试试

yszong 发表于 2022-6-11 16:00

或者看看有没有重复项合并下

renyaq 发表于 2022-6-11 16:02

当然可以了

heweibig 发表于 2022-6-11 16:04

if里边嵌套for就可以

wyjie 发表于 2022-6-11 16:07

if 嵌套for 然后在for里边嵌套if就行了

chuxh 发表于 2022-6-11 16:10

嵌套多了 会不会速度变慢

pengf 发表于 2022-6-11 16:13

这种有规律的直接用查表法,和函数指针打包成一个结构体,代码清晰干净

wenfen 发表于 2022-6-11 16:16

好的,我明天去单位试一下,多谢各位大侠了哈

kiwis66 发表于 2022-6-19 14:34

if少用,容易头晕
页: [1]
查看完整版本: 8个IF语句