【问题标题】:Why I cannot store into a variable the return result of an logic expression in C code?为什么我不能将 C 代码中逻辑表达式的返回结果存储到变量中?
【发布时间】:2018-11-23 13:49:08
【问题描述】:

我有一小段 C 代码的奇怪行为。 我想将布尔表达式的结果存储在变量中,但它似乎不起作用。

按照代码:

 #define rtCP_Constant_Value_fklq (uint8_t) 1 //Simulink const
 #define rtCP_Constant_Value (uint8_t) 0 //Simulink const

 uint16_t rtb_tobit;
 volatile unsigned char rtb_y;
 uint8_t asr_ena_=14;
 rtb_tobit = (1 << rtCP_Constant_Value_fklq);

 uint8_t temp = ((uint8_t)rtb_tobit) & asr_ena_;
 rtb_y = (temp !=(rtCP_Constant_Value));

我已经在 Nucleo 评估板上使用两个编译器 Renesas SH 9_4_1 和 gcc-arm non-eabi 测试了这段代码。 在它们中,变量rtb_y 始终为零。 调试器显示表达式(temp !=(rtCP_Constant_Value)) 为真,但我不明白为什么,变量rtb_y 始终等于0。

有人能解释一下为什么吗?这种奇怪的行为是因为我使用了 C 标准吗?

【问题讨论】:

  • 如果您在构建时启用更多警告(至少添加-Wall-Wextra 标志,可能是-pedantic),编译器不会报错?
  • 我不知道这些板子,但volatile 变量被允许以实现定义的方式改变它的值:有可能在这个平台上,设置它似乎 i> 什么都不做,因为它可以立即将自己变回零(也许它检测到它已设置并执行其他操作作为中断?)。
  • @Someprogrammerdude 我会试试你的建议。
  • @Leushenko 我不使用中断,我只使用 volatile 来避免优化。
  • #defines 中删除;。示例#define rtCP_Constant_Value_fklq ((uint8_t) 1)。 xmaze,这对你有用吗?

标签: c gcc arm


【解决方案1】:

以您使用宏的方式使用宏是一个非常糟糕的主意。通常,您需要非常小心地在正确的位置使用括号。你也不应该包括 ;在宏中。例如,这样更好:

#define rtCP_Constant_Value_fklq ((uint8_t) 1) //Simulink const

但是,实际上不可能为您的问题提供比这更多的帮助,因为由于包含 ;,您的示例将无法编译。如果您使用可编译的代码更新问题,可能会提供进一步的帮助。

【讨论】:

  • 嗨,很抱歉消息中的语法错误,我可以编译这段代码并调试。我发现了错误las nicht。这是编译器的优化问题。
猜你喜欢
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 2022-01-07
  • 2014-05-08
  • 1970-01-01
  • 2014-07-30
相关资源
最近更新 更多