定义不评估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不应该增加两次吗?一次通过双重通话,一次当第一次双重通话结束时?

+1

我不确定这是一个错字,还是在实际的代码中,但宏应该是'((i)> = 0?(i): - (i))'。 ('?'而不是'=') – 2010-07-12 13:01:06

+0

是的,是的。这是相当愚蠢的错误。 – IAE 2010-07-12 13:09:39

相反的:

#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

+0

由于某种原因,我不得不盯着那30秒,直到我注意到这个差异。我诅咒你,三元'':'操作员! – 2010-07-12 13:01:45

+0

相同,但是当您注意到您刚刚在SO上暴露了您的拼写错误时,这使得它更加令人不快:更新的问题! – IAE 2010-07-12 13:09:24