我正在网上浏览C ++ FAQ Lite。我再次浏览内联,因为我没有找到他们的用途,并想知道如何停止循环依赖,如this回答所示。我第一次尝试这样做,“为什么内联比定义更好。”示例包含以下代码:
#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吗?
如果宏被调用两次,那么它不是这样的:
unsafe(x)//预先递增不会在调用时修改该值。
unsafe(++ x)//对于所有意图和目的,增量发生在第二次调用之前,所以++ x。这是第一个ans = unsafe(x++)
,如果它被调用两次。
当我们到达第二个ans = unsafe(++x)
时,x不应该增加两次吗?一次通过双重通话,一次是第一次双重通话结束?
答案 0 :(得分:3)
而不是:
#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
。