【发布时间】:2013-02-10 14:52:27
【问题描述】:
测试。(c/cpp)
#include <stdio.h>
int main(int argc, char** argv)
{
int a = 0, b = 0;
printf("a = %d, b = %d\n", a, b);
b = (++a)--;
printf("a = %d, b = %d\n", a, b);
return 0;
}
如果我将以上内容保存为 .cpp 文件,它会在执行时编译并输出:
a = 0, b = 0
a = 0, b = 1
但是,如果我将其保存为 .c 文件,则会收到以下错误:
test.c:7:12: error: lvalue required as decrement operator.
(++a) 操作不应该在(newValue)-- 操作之前解决吗?有人对此有任何见解吗?
【问题讨论】:
-
b = (++a)--;未定义的行为吗? -
@LihO:为什么?
a上的增量在其评估之前排序 -
为什么不只是
b = a + 1 -
@AndyProwl:我总是避免在同一行中使用更多的前增量/后增量操作......我不想最终得到这样的结果:
b = ++a + ++a;,到目前为止已经是 UB据我所知。 -
我认为真正要理解的教训是,C 代码行数越少,程序就越快。最好写 2 或 3 行。它更明显,更容易理解。我建议仅在非常特殊的情况下使用 predecrement/increment 并仅使用 post decrement/increment(即您无法找到任何其他方式来编写它)。
标签: c++ c language-lawyer lvalue incompatibility