Определить не оценивая POD? - PullRequest
1 голос
/ 12 июля 2010

Я изучал C ++ FAQ Lite онлайн. Я снова просматривал inlines, так как я не нашел их использования и хотел знать, как остановлена ​​циклическая зависимость, как показано в этом ответе. Сначала я попытался сделать: «Почему строки лучше, чем определения». пример со следующим кодом:

#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;
}

EDIT:

Отлично. Получил опечатку с дороги. Не то чтобы я был огорчен тем, что не нахожу таких ошибок или чего-то еще.

Вывод теперь 6, 9, 9, 11.

Однако, даже с предварительным увеличением, не должно ли первое значение получить 7?

Если макрос вызывается дважды, то разве это не будет так:

unsafe (x) // предварительное увеличение не изменяет значение при вызове.

unsafe (++ x) // для всех намерений и целей приращение происходит перед вторым вызовом, поэтому ++ x. Это для первого ans = unsafe(x++), если он вызывается дважды.

К тому времени, когда мы дойдем до второго ans = unsafe(++x), разве х не должен был быть увеличен вдвое? Один раз по двойному вызову и один раз, когда первый двойной вызов был закончен?

1 Ответ

3 голосов
/ 12 июля 2010

Вместо:

#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.

...