после выполнения (на VC6): j1==0; j2==4
Т.е. получается что первое условие и второе это разные выражения?
Или стандартом не оговорено когда надо делать пост операции?
Здравствуйте Silver_s, Вы писали:
SS>post decrement/increment должен выполняться после вычисления значения выражения, но что нужно понимать под выражением?
SS>Или стандартом не оговорено когда надо делать пост операции?
Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте Silver_s, Вы писали:
SS>>post decrement/increment должен выполняться после вычисления значения выражения, но что нужно понимать под выражением?
SS>>Или стандартом не оговорено когда надо делать пост операции?
DG>Вот здесь был большой разговор на эту тему: DG>http://www.rsdn.ru/forum/message.asp?mid=48027
Тут сразу несколько граблей раскидано.
1) undefined behavior (неопределенное поведение) при неоднократном использовании автоинкремента в выражении
2) правила вычисления оператора &&
3) не инициализированные переменные (j1, j2) (сработает вместе с оператором && )
Наконец, с учетом компиляции в режиме debug (без оптимизаций), мы получили весьма ожидаемый результат.
Вот что родил компилятор
[c]
i_1 = i; // i_1 = 0
i_2 = i; // i_2 = 0 (повезло, что постинкремент выполняется позже)
j1 = i_1 + i_2; // j1 = 0
ok_1 = j1 != 13; // ok_1 = true
i++; i++; // i = 2 (а вот и автоинкремент)
Здравствуйте Silver_s, Вы писали:
SS>post decrement/increment должен выполняться после вычисления значения выражения, но что нужно понимать под выражением?
SS>Или стандартом не оговорено когда надо делать пост операции?
Не оговорено. Все побочные эффекты должны возыметь место до следуюшей точки следования. Точнее сказать нельзя.
Постинкремент означает, что в выражении будет использовано значение переменной до инкремента. А когда кокретно поизойдет сам инкремент — никто не знает. Инкремент, если так захочет компилятор, может произойти даже до использования значения переменной в выражении.
Например, вот такой С++ код
int a, b;
...
a = b++ + 5;
компилятор, если захочет, может странслировать вот в такой результирующий код
mov eax, b
inc b
add eax, 5
mov a, eax
т.е. собственно инкремент переменной 'b' делается еще до того, как будет выполнено сложение с 5 и переменная 'a' получит новое значение. Тем не менее код ведет себя так, как должен вести себя именно постинкремент.
Здравствуйте Silver_s, Вы писали:
SS>post decrement/increment должен выполняться после вычисления значения выражения, но что нужно понимать под выражением?
SS>
SS>после выполнения (на VC6): j1==0; j2==4 SS>Т.е. получается что первое условие и второе это разные выражения? SS>Или стандартом не оговорено когда надо делать пост операции?
Оператор && разделяет выражения, но не является его елементом.
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Здравствуйте Silver_s, Вы писали:
SS>>post decrement/increment должен выполняться после вычисления значения выражения, но что нужно понимать под выражением?
SS>>Или стандартом не оговорено когда надо делать пост операции?
АТ>Не оговорено. Все побочные эффекты должны возыметь место до следуюшей точки следования. Точнее сказать нельзя.
АТ>Постинкремент означает, что в выражении будет использовано значение переменной до инкремента. А когда кокретно поизойдет сам инкремент — никто не знает. Инкремент, если так захочет компилятор, может произойти даже до использования значения переменной в выражении.
АТ>Например, вот такой С++ код
АТ>
АТ>int a, b;
АТ>...
АТ>a = b++ + 5;
АТ>
АТ>компилятор, если захочет, может странслировать вот в такой результирующий код
АТ>
АТ>mov eax, b
АТ>inc b
АТ>add eax, 5
АТ>mov a, eax
АТ>
АТ>т.е. собственно инкремент переменной 'b' делается еще до того, как будет выполнено сложение с 5 и переменная 'a' получит новое значение. Тем не менее код ведет себя так, как должен вести себя именно постинкремент.
Позволю не согласится
оператор + есть функция от двух переменных
перепишем его в виде plus(a, b)
таким образом
a++ + b
эквивалентно
plus(a++, b)
а здесь уже a+1 внутрь передаваться не будет никогда.
Может я чего-то не понимаю ???
Здравствуйте flyker, Вы писали:
F>Оператор && разделяет выражения, но не является его елементом.
iso/iec 14882 5/1:
An expression is a sequence of operators and operands that specifies a computation.
Выражение содержит опреаторы и операнды. Оно состоит из опреаторов и операндов. Оператор — часть выражения. && — оператор.
F>P.S. ... сорри если говорю прописные истины
Истины, говоришь, говоришь?.. Может, книжку почитать сперва?
Здравствуйте flyker, Вы писали:
F>оператор + есть функция от двух переменных F>перепишем его в виде plus(a, b) F>таким образом F>a++ + b F>эквивалентно F>plus(a++, b) F>а здесь уже a+1 внутрь передаваться не будет никогда. F>Может я чего-то не понимаю ???
оператор есть функция только с синтаксической точки зрения, но не с точки зрения исполнения кода.
Вызов функции устанавливает по крайней мере 2 точки следования — до ее вызова и после, а арифметическое выражение не устанавливает точек следования внутри себя.
Поэтому тут нет эквивалентности.
Здравствуйте Kaa, Вы писали:
Kaa>Здравствуйте flyker, Вы писали:
F>>Оператор && разделяет выражения, но не является его елементом. Kaa>iso/iec 14882 5/1: Kaa>An expression is a sequence of operators and operands that specifies a computation.
Kaa>Выражение содержит опреаторы и операнды. Оно состоит из опреаторов и операндов. Оператор — часть выражения. && — оператор.
F>>P.S. ... сорри если говорю прописные истины Kaa>Истины, говоришь, говоришь?.. Может, книжку почитать сперва?
Здравствуйте flyker, Вы писали:
F>Позволю не согласится
F>оператор + есть функция от двух переменных F>перепишем его в виде plus(a, b) F>таким образом F>a++ + b F>эквивалентно F>plus(a++, b) F>а здесь уже a+1 внутрь передаваться не будет никогда. F>Может я чего-то не понимаю ???
Не понимаешь. Для скалярных типов 'operator ++' функций не является.
F>>оператор + есть функция от двух переменных F>>перепишем его в виде plus(a, b) F>>таким образом F>>a++ + b F>>эквивалентно F>>plus(a++, b) F>>а здесь уже a+1 внутрь передаваться не будет никогда. F>>Может я чего-то не понимаю ???
АТ>Не понимаешь. Для скалярных типов 'operator ++' функций не является.
И это очень важная деталь. В письме от DarkGray есть ссылка на thread, где эта тонкость детально объясняется.
Здравствуйте Silver_s, Вы писали:
SS>post decrement/increment должен выполняться после вычисления значения выражения, но что нужно понимать под выражением?
SS>
SS>после выполнения (на VC6): j1==0; j2==4 SS>Т.е. получается что первое условие и второе это разные выражения? SS>Или стандартом не оговорено когда надо делать пост операции?
Вообще, и i++ и ++i делают одно и тоже, просто постфиксный инкремент ВОЗВРАЩАЕТ i, а префииксный — i+1, а в тот момент, как опрератор возвратил значение, i в любом случае увеличена на единицу, т.е.
Здравствуйте Lummox, Вы писали:
L>Вообще, и i++ и ++i делают одно и тоже, просто постфиксный инкремент ВОЗВРАЩАЕТ i, а префииксный — i+1, а в тот момент, как опрератор возвратил значение, i в любом случае увеличена на единицу, т.е.
Нет. Увеличено ли 'i' на единицу в тот момент, когда оператор "возвратил значение", или нет — никто не знает. Увеличение должно произойти не позже, чем управление дойдет до следующей точки следования. В какой конкретно момент оно призойдет — предсказать невозможно.
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Здравствуйте Lummox, Вы писали:
L>>Вообще, и i++ и ++i делают одно и тоже, просто постфиксный инкремент ВОЗВРАЩАЕТ i, а префииксный — i+1, а в тот момент, как опрератор возвратил значение, i в любом случае увеличена на единицу, т.е.
АТ>Нет. Увеличено ли 'i' на единицу в тот момент, когда оператор "возвратил значение", или нет — никто не знает. Увеличение должно произойти не позже, чем управление дойдет до следующей точки следования. В какой конкретно момент оно призойдет — предсказать невозможно.
Признаю, погорячился... Я имел в виду сказать, что об оператора делают одно и тоже за тем исключением, что возвращаемое значение у них разное