等于运算符“==”表现得像赋值运算符“=”

时间:2015-02-09 16:44:10

标签: c conditional-operator

我面临一个非常奇怪的问题。

- 我有if条件:

if((IN_SYNC == sync_flag) || (cycle_number == spi_slot_number))

在条件之前,变量" spi_slot_number"是' 7'在if条件之后,它转向了' 0' 0 (这是" cycle_number&#34的值;)!!!

有谁知道这样的事情怎么会发生?!

重要说明:

1-我的代码是用C语言编写的。

2-我在条件之前和之后检查了堆栈,以确保没有发生堆栈损坏。

3-我的程序是一个线程程序,因此没有中断或其他线程可以中断。

4-如果我评论if条件,那么一切都很顺利。

5-我不知道如何生成汇编代码...

2 个答案:

答案 0 :(得分:2)

正如其他人所说,您还没有分享足够的代码来实际识别您的问题所在。然而,我想到的一个想法是IN_SYNC标识符。将宏放在所有大写字母中是一种标准的编码惯例,如果它是一个宏,那么它可能会做出肮脏的行为。检查IN_SYNC

的定义

另一件事 - 您的if测试有两个测试,由||分隔运营商。尝试分开两个测试,看看哪一个导致你的副作用。像这样:

printf("%d \n", spi_slot_number);
if (IN_SYNC == sync_flag) { 
    /* do nothing */
    }
printf("after IN_SYNC test %d \n", spi_slot_number);
if (cycle_number == spi_slot_number) {
    /* do nothing */
    }
printf("after cycle_number test %d \n", spi_slot_number);

答案 1 :(得分:1)

如果您对spi_slot_number的临时副本进行比较会发生什么?它是否按预期工作?

void GetData(slot_id_T spi_slot_number, uint8_t* data_received,
         uint16_t data_length, uint8_t data_is_valid_flag)
 {
     uint8_t cycle_number;
     slot_id_T copy = spi_slot_number; // <- ADDED

     cycle_number = GetCycleNumber() + 1;
     if(cycle_number > LAST_CYCLE)
     {
         cycle_number = 0;
     }

     printf("%d \n", spi_slot_number);

     if((IN_SYNC == sync_flag) || (cycle_number == copy)) // <- CHANGE
     {
         printf("%d \n", spi_slot_number);

         switch(data_is_valid_flag)
         {
         case DATA_IS_VALID:
             SendData(spi_slot_number, p_buffer, data_length);
             break;

         case DATA_IS_NOT_VALID:
             IndicateDataNotValid(spi_slot_number, p_buffer, data_length);
             break;

         default:
             /* Do Nothing */
             break;
         }
      }
}