Поведение вашего макроса не определено, что означает любой результат возможен.
Chapter and verse
6.5 Выражение
...
Если побочный эффект на скалярный объекте unsequenced по отношению к любому другому побочному эффекту
на том же скалярном объекте или в стоимости е вычисление с использованием значения одного и того же скалярного объекта,
поведение не определено.Если существует несколько допустимых упорядочений подвыражениям
выражения, поведение не определено, если такая unsequenced сторона эффект возникает в любом
из упорядочений.
84)
84) Этот пункт оказывает неопределенные выписки такие выражения, как i = ++i + 1;
a[i++] = i;
, позволяя i = i + 1;
a[i] = i;
В принципе, если вы измените значение объекта более одного раза в выражении или оба изменяют объект и используют его значение при вычислении в выражении, результат не будет четко определен, если не существует seq uence point между этими операциями. За некоторыми исключениями, C не приводит к оценке слева или справа от оценок выражений или параметров параметров, а также не требует, чтобы побочный эффект ++
или --
был применен сразу после оценки. Таким образом, результат выражения типа x++ * x++
будет варьироваться от платформы к платформе, программы к программе или даже потенциально от запуска до запуска (хотя я никогда не видел этого на практике).
Например, учитывая выражение y = x++ * x++
, следующая последовательность оценки можно:
t0 <- x // right hand x++, t0 == 2
t1 <- x // left hand x++, t1 == 2
y <- t0 * t1 // y = 2 * 2 == 4
x <- x + 1 // x == 3
x <- x + 1 // x == 4
, который не даст вам результат, который вы ожидаете, если вы предполагаете, слева направо оценки.
Также http://stackoverflow.com/questions/11060968/using-the-post-increment-in-function-arguments и многие другие вопросы. – AnT
Извините, я не сразу понял, что это не вызов функции. Однако это не меняет сути проблемы. – AnT
Прочтите информационную страницу, прежде чем спрашивать! Это один из вопросов «не спрашивайте». – Olaf