【发布时间】:2013-09-19 14:26:16
【问题描述】:
我认为下面的代码是邪恶的,但它可以在没有任何警告的情况下编译。
int f(int n)
{
return n + 1;
}
int n = 0;
n = f(n++) + f(++n);
我只是想知道为什么神圣标准不弃用此类运算符?
我想可能有两个原因:
一个可能是为了向后兼容;
另一个可能是在某些情况下这些运算符非常有用。
如果后者是真的,你能给我举几个例子吗?谢谢。
【问题讨论】:
-
好吧,如果我没记错的话,上面的表达式被定义为未定义(双关语)行为。是的,运算符本身非常有用、紧凑且易读。
-
“我只是想知道为什么神圣标准不弃用这些运算符?”它不会弃用它们,因为没有人编写这样的代码。
-
仅仅因为某些东西可能最终被错误地使用并不意味着它必须从标准中删除。有很多 evil 东西在没有任何警告的情况下编译得很好。
-
您使用哪个编译器可以毫无怨言地编译代码?使用 GCC 4.8.1(C 和 C++ 编译器),我得到:
x3.cpp:11:14: error: lvalue required as increment operand突出显示声明n = f(++n++) + f(++n++);— 所有编译器都应该给出该错误,AFAIK。 -
@JonathanLeffler 我们有一个经典的“不是真正的代码”问题:OP 将他们的帖子从
f(++n++) + f(++n++)编辑为f(n++) + f(++n),这是一个相当可笑的不同问题。它们都使用 ascii 字符以及前置和后置运算符,因此它们并不完全不同。
标签: c++ c coding-style standards unary-operator