Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: порядок выполнения постфикса и префикса  (Прочитано 35040 раз)
0 Пользователей и 1 Гость смотрят эту тему.
NetRaider
Гость
« Ответ #30 : 07-10-2003 09:28 » 

Цитата
NetRaider, в контексе странного примера (i=i++) это может быть и неимеет смысла. Вот можешь ли сказать какой по стандарту (какому именно? О чем ты гоаорил? О ANSI С?) будет порядок вычисления для "a=b[j]" - когда вычисляется "i", а когда "j" (рассматривай это не как переменные, а как выражения)?


1. модификация более одного раза скалярного объекта между двумя точками следования порождает неопределенное поведение.

рассморим выражение a[i]=b[j]

Здесь с точками следования все нормально, т.е. нет неопределенного поведения. НО, предсказать результат(порядок выполнения) невозможно, потому что

а) В рамках одного выражения порядок вычисления подвыражений не определен.
б) Порядок вычисления параметров функции не определен.

Т.е. неопределенное поведение в примере отсутствует но результат зависит от порядка вычисления. Хотя в примере все равно каков порядок выцисления выражения i или j - как не переставляй одно и тоже. В этом отношении пример неудачен, поскольку результат не зависит от порядка вычисления.

Но в выражении a[i]=a[i++] [b]результат зависит от порядка вычисления подвыражений, заключенных в '[]'[/b]. Хотя здесь, в отличии от выражения i=i++(порождающего неопределенное выражение), нет undefined behavior(в предыдущем посте я написал что есть - это описка)
« Последнее редактирование: 20-11-2007 17:02 от Алексей1153++ » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #31 : 07-10-2003 09:58 » 


Естественный порядок разбора выражения - слева направо. (Можешь отрицать, - подкрепи чем-нибудь?)

Возьмем твой пример a[i]=a[i++].
Здесь 4 оператора:
1) []
2) =
3) []
4) ++
С учетом приоритета и вложености 4 в 3 получаем порядок вычисления: 1,4,3,2.
Т.е., при i=0, получаем a[0]=a[0]; i++;

Утверждаю третий раз: пост/преф. inc/dec есть одна операция, а не две. Разница только в том, какое значение вернет оператор - предидущее или новое.

Вот еще пример последовательности исполнения:

#include <stdio.h>
int a[4];
a[printf("1")]=a[printf("2")];


12
« Последнее редактирование: 20-11-2007 17:03 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
NetRaider
Гость
« Ответ #32 : 07-10-2003 10:14 » 

Цитата

Естественный порядок разбора выражения - слева направо. (Можешь отрицать, - подкрепи чем-нибудь?)


Буду отрицать.

Стандарт С++ :

(5.0)  i = v[i++]; // the behavior is unspecified

Поищи  в MSDN'e или гуглом 'sequence point'
В частности это http://www.eskimo.com/~scs/C-faq/q3.9.html
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #33 : 07-10-2003 10:41 » new

Отлично Я пишу не на С++, а на чистом С.

А обращаться к MS как к стандарту я считаю неправильным - только оригинальный стандарт может быть, остальные диалекты на совести производителя компилятора.

По ссылке: автор ссылается на ряд стандартов. Но найти самого стандарта не могу - основная причина: поисковики не воспринимают одиночную букву "С" и отбрасывают ее. То же самое и на www.ansi.org . Если есть ссылочка - дай, пожалуйста.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
NetRaider
Гость
« Ответ #34 : 07-10-2003 11:08 » 

Цитата

Я пишу не на С++, а на чистом С.

К С тема обсуждения также отсносится.

Цитата

А обращаться к MS как к стандарту я считаю неправильным - только оригинальный стандарт может быть, остальные диалекты на совести производителя компилятора.

 
Там есть пара похожих примеров. К томуже почти все отклонения от Стандарта задокументированы.
Цитата


По ссылке: автор ссылается на ряд стандартов. Но найти самого стандарта не могу - основная причина: поисковики не воспринимают одиночную букву "С" и отбрасывают ее. То же самое и на www.ansi.org . Если есть ссылочка - дай, пожалуйста.


лежал тут - http://shelek.com/club/download.php?id=19
Онлайн копия доступна здесь - http://www.kuzbass.ru/docs/isocpp/
Если будешь искать, название - ISO/IEC 14882 1998
А вообще он платный - 18$ Улыбаюсь - http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS/ISO/IEC+14882-1998
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #35 : 07-10-2003 11:20 » 

Спасибо - почитаю - сверюсь. Неверю я что в то, что я лучше их понимаю как надо делать Ага  Быстрее всего, они не описали этот момент в ранних стандартах, а потом было уже позно (понаделали компиляторов) и просто объявили неопределенной операцией.
Цитата
А вообще он платный - 18$  

Лови: $$$$$$$$$$$$$$$$$$  Отлично
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines