定义不评估POD?
我在网上浏览C++ FAQ Lite。我再次浏览内联,因为我没有找到他们的用途,并想知道如何停止循环依赖如this答案中所示。我首先试图做到“为什么内联比定义更好”。例如用下面的代码:定义不评估POD?
#define unsafe(i) \
((i) >= 0 ? (i) : -(i))
inline
int safe(int i)
{
return i >= 0 ? i : -(i);
}
int f();
int main(void)
{
int x(5);
int ans;
ans = unsafe(x++);
cout << ans << endl;
ans = unsafe(++x);
cout << ans << endl;
ans = safe(x++);
cout << ans << endl;
ans = safe(++x);
cout << ans << endl;
std::cin.get();
return 0;
}
编辑:
大。错过了错字。不是说我很苦,我没有发现这样的错误或任何东西。
输出现在是6, 9, 9, 11
。
但是,即使预增量,第一个值不应该导致7?
如果宏被调用两次,然后不它是这样的:
不安全的(X)//前递增调用时不会修改值。
unsafe(++ x)//对于所有意图和目的,增量发生在第二次调用之前,所以++ x。如果被调用两次,这是第一个ans = unsafe(x++)
。
当我们到达第二个ans = unsafe(++x)
时,x不应该增加两次吗?一次通过双重通话,一次当第一次双重通话结束时?
相反的:
#define unsafe(i) \
((i) >= 0 = (i) : -(i))
我想你想:
#define unsafe(i) \
((i) >= 0 ? (i) : -(i))
在回答您的编辑:
第一次调用unsafe(x++)
后,x
是7,即使ans
是6.这是因为你有这样的说法:
ans = ((x++) >= 0 ? (x++) : -(x++))
ans
被分配给中间x++
后最左边的x++
进行评价。因此,ans == 6
但是x == 7
。与unsafe(++x)
的区别在于ans
被分配给++x
,这意味着结果为ans == x == 9
。
由于某种原因,我不得不盯着那30秒,直到我注意到这个差异。我诅咒你,三元'':'操作员! – 2010-07-12 13:01:45
相同,但是当您注意到您刚刚在SO上暴露了您的拼写错误时,这使得它更加令人不快:更新的问题! – IAE 2010-07-12 13:09:24
我不确定这是一个错字,还是在实际的代码中,但宏应该是'((i)> = 0?(i): - (i))'。 ('?'而不是'=') – 2010-07-12 13:01:06
是的,是的。这是相当愚蠢的错误。 – IAE 2010-07-12 13:09:39