【发布时间】:2017-10-24 22:58:26
【问题描述】:
u8 num[] = {0x00, 0x00, 0x40};
u8*ptr = num;
u8 tag;
u16 len;
tag = *ptr++;
len = (u16)*ptr++ <<8 | *ptr++;
我希望 len = 0x0040 但 len 在 Visual Studio 2013 中设置为 0x0000。
我不知道为什么会这样。
你能用运算符优先级的观点来解释吗?
【问题讨论】:
-
添加一些括号,您将不需要依赖运算符优先级。问题解决了。 (尽管 ++ 可能存在未定义的行为)
-
答案很简单:不要这样写代码。用括号写,或者单独的行,然后让编译器优化它。
-
当我在 HP-UX 下编译您的代码时,它会按您的预期运行。这归结为“实现定义的行为”,特别是“何时调用 ++ 运算符?”。 VS 显然直到语句完成后才增加指针,这是合理的,因为语句中间没有序列点。相反,HP-UX C 编译器在每次访问后立即递增指针(显然 - 我没有反汇编代码来检查),这是允许但不是必需的。
-
如果你写的代码在写的时候很难看懂,最好换一种风格试试。想想几个月后做维护的可怜人(这可能是你)
-
最后一行是未定义的行为(
ptr写了两次没有序列点)
标签: c operator-keyword operator-precedence