Сколько будет (a++ + a++)?

 
1 2 3 4 5 6

Rada

опытный

Упс, там у Рады ошибка - надо не int b = (a++) + (a++); а int a = (a++) + (a++);
 
Да в самом деле. Сорри всем.
С себя можно начать когда все остальное будет в порядке.  
+
-
edit
 

-exec-

опытный

Balancer, 06.07.2004 15:43:38 :
Да, в этом смысле верно. Но тогда i = i++ не должно менять значение i, не так ли?
 


странные у вас компиляторы... или логика :)

постфиксный инкремент выполняется после отработки выражения имхо. то есть отрабатывается всё выражение без инкрементов, а потом делается "второй проход", где lvalue уличённые в использовании постинкремента увеличиваются.
то есть a = a++ + a++
должно выполняться так:
a = a + a; //здесь a:= 10
a += 1;
a += 1;
к концу вычисления всех выражений (как прямых, так и постериорных) результат будет 12.

b = a++ + a++ //даёт b == 10 и a == 12 (правлена опечатка - писал a == 7)
шаманство со скобками ваще анафема какая-то басурманская. в данном случае они влиять не должны.

по поводу цитированной фразы:
i = i++
выполнится так:
i = i;
i += 1;
и значение переменной измениться должно.

впрочем как и в случае i = ++i;
i += 1;
i = i;

упражнения на cbuilder5 с компиллятором bcc32.exe "Borland C++ 5.5 for Win32 Copyright © 1993, 2000 Borland" подтверждают мои слова.
:rolleyes:

за момент вычисления инкремента цикла балансер абасалюдна прафф - он выполняется после тела цикла.
 
Это сообщение редактировалось 06.07.2004 в 21:04
RU Филич #06.07.2004 20:56
+
-
edit
 

Филич

втянувшийся

постфиксный инкремент выполняется после отработки выражения имхо. то есть отрабатывается всё выражение без инкрементов, а потом делается "второй проход", где lvalue уличённые в использовании постинкремента увеличиваются.
 

ну правильно! так и должно быть. а приведенный пример, где переменная в одном месте 5, в другом 6 - это уже неверно. область памяти то одна.
существуют только два типа кораблей: подводные лодки и их цели
 
+
-
edit
 

-exec-

опытный

Balancer:
По твоей логике должно быть 5 + 6 и потом увеличение i на 1 от i++ -> 12.

Я не прав?
 

не прав.

в свете вышесказзаного мной:
a = a++ + ++a
раскладывается на
a += 1; // a == 6
a = a + a; // a == 12
a += 1; // a == 13
 
RU Филич #06.07.2004 21:01
+
-
edit
 

Филич

втянувшийся

Так оно и работает во всех случаях, кроме встроенного ++ в Си++. Там же уже после присванивания происходит скрытая операция над числом.
 

на то он и постфиксный оператор

а вот на стеке держать несколько значений одной переменной - это точно от лукавого :)
существуют только два типа кораблей: подводные лодки и их цели
 

Rada

опытный

область памяти то одна.
 
Неверно. Попробуй скомпилить (a++)++. Выдаст ошибку "Требуется l-value". Значение a++ - есть временный анонимный обьект, и область памяти соотв. другая чем a.
С себя можно начать когда все остальное будет в порядке.  
RU Филич #06.07.2004 21:45
+
-
edit
 

Филич

втянувшийся

значение выражения - да. но я имел ввиду, что значение переменной меняется после выражения.
code text
  1. 00411A81  mov         edx,dword ptr [i]
  2. 00411A84  add         edx,1
  3. 00411A87  mov         dword ptr [i],edx
существуют только два типа кораблей: подводные лодки и их цели
 
RU Кирилл #07.07.2004 07:59
+
-
edit
 

Кирилл

втянувшийся

Вот за это я Си и не люблю.
- Сами понимаете, вселенная-то на моей стороне.
- Вот это мне таким вульгарным и кажется.
 
RU Филич #07.07.2004 10:08
+
-
edit
 

Филич

втянувшийся

Кирилл
странные вы люди... все же логично и естесственно. всегда понятно, что, где и как в памяти лежит.
существуют только два типа кораблей: подводные лодки и их цели
 
+
-
edit
 

trainer

втянувшийся

Орлы!
Вы пытаетесь говорить что как-то вычислять правильно, а как-то нет только потому, что так делает ваш любимый компилятор и подстраиваете свое объяснение под его поведение.
В стандарте же ясно написано - behavior is unspecified.
Что мешает переписать это выражение так, чтобы behavior был specified?

Изменение объекта - побочный эффект(side effect). Порядок проявления побочных эффектов не определен. Определено только, что в sequence point все побочные эффекты предыдущих вычислений проявились, а ни один побочный эффект последующих - нет.

Unspecified behavior - похоже на implementation-defined behavior, но при этом эта самая implementation не обязана документировать это самое behavior. :)
Во имя Ctrl, Alt и святаго Del. Enter!
 
Это сообщение редактировалось 07.07.2004 в 11:11
RU Кирилл #07.07.2004 12:19
+
-
edit
 

Кирилл

втянувшийся

2 Филич
Ни логикой, ни естественностью здесь не пахнет. Я предпочитаю языки, в которых определен порядок операций при вычислении выражения.
2 trainer
Я не пишу на Си.
- Сами понимаете, вселенная-то на моей стороне.
- Вот это мне таким вульгарным и кажется.
 
RU Филич #07.07.2004 12:54
+
-
edit
 

Филич

втянувшийся

Кирилл
в С/С++ определен, но есть и ситуации, которые хорошо описал trainer. а языки, в которых невозможно указать на конкретную область памяти как на хранилище конкретной переменной, это и есть неестественные. потому как являют собой надстройку над языками более низкого уровня.
в С/С++ просто немного структуру памяти и процесс работы программы представлять себе надо.
существуют только два типа кораблей: подводные лодки и их цели
 
RU Кирилл #07.07.2004 14:14
+
-
edit
 

Кирилл

втянувшийся

2 Филич
> в С/С++ определен, но есть и ситуации, которые хорошо описал trainer.
Плохо определен, слишком много отдано на откуп реализациям.
> а языки, в которых невозможно указать на конкретную область памяти как на хранилище конкретной переменной, это и есть неестественные
Хм, этот ответ явно не мне :) . Что до естественности, то ассемблер тут вне конкуренции.
> в С/С++ просто немного структуру памяти и процесс работы программы представлять себе надо.
Слишком много надо представлять в тех случаях, когда само по себе это не так уж и важно, очень запутанный синтаксис.
- Сами понимаете, вселенная-то на моей стороне.
- Вот это мне таким вульгарным и кажется.
 
+
-
edit
 

trainer

втянувшийся

Кирилл:
Плохо определен, слишком много отдано на откуп реализациям.
 
Определен хорошо. Стандарт - не учебник, его читать неудобно. :)
Слишком строгая стандартизация повредила бы эффективности. Часть вещей не описана потому, что они описаны в ISO C(те же sequence point). Хотя в действующем стандарте есть несколько неоднозначностей. :)
Во имя Ctrl, Alt и святаго Del. Enter!
 

Rada

опытный

trainer, 07.07.2004 09:20:59 :
Орлы!
Вы пытаетесь говорить что как-то вычислять правильно, а как-то нет только потому, что так делает ваш любимый компилятор и подстраиваете свое объяснение под его поведение.
В стандарте же ясно написано - behavior is unspecified.
Что мешает переписать это выражение так, чтобы behavior был specified?

Изменение объекта - побочный эффект(side effect). Порядок проявления побочных эффектов не определен. Определено только, что в sequence point все побочные эффекты предыдущих вычислений проявились, а ни один побочный эффект последующих - нет.

Unspecified behavior - похоже на implementation-defined behavior, но при этом эта самая implementation не обязана документировать это самое behavior. :)
 


2 trainer:
Изменение объекта - побочный эффект(side effect). Порядок проявления побочных эффектов не определен.
 
Что значит неопределён? Вы согласны, что:

1. Операция - нераздельная суть?
2. Приоритет ++ выше приориета +?

Я же привёл перегрузку оператора. Почему там то работает нормально?
С себя можно начать когда все остальное будет в порядке.  
RU Кирилл #08.07.2004 07:25
+
-
edit
 

Кирилл

втянувшийся

2 Rada
В Си очевидным образом нарушается первый пункт.
2 trainer
Когда в угоду "эффективности" часть операции (++) выполняется сразу, а часть - ХЗ когда (особенно прикольно, если позже операции присваивания), это называется дурью. Кстати, подобная "эффективность" имела смысл только на медлительных компах с DEC-овской системой команд. Кстати, стандарт языка Ада написан вполне понятным (в переводе) языком.
- Сами понимаете, вселенная-то на моей стороне.
- Вот это мне таким вульгарным и кажется.
 
+
-
edit
 

trainer

втянувшийся

Rada:
Приоритет ++ выше приориета +?
 
Приоритеты стандартом явно не определены. :)
Rada:
Я же привёл перегрузку оператора. Почему там то работает нормально?
 
Перегруженный оператор - функция. Вызов функции - sequence point. :)
На всякий случай - список sequence point'ов(из ISO C):
1 The following are the sequence points described in 5.1.2.3:
— The call to a function, after the arguments have been evaluated (6.5.2.2).
— The end of the first operand of the following operators: logical AND && (6.5.13);
logical OR || (6.5.14); conditional ? (6.5.15); comma , (6.5.17).
— The end of a full declarator: declarators (6.7.5);
— The end of a full expression: an initializer (6.7.8); the expression in an expression
statement (6.8.3); the controlling expression of a selection statement (if or switch)
(6.8.4); the controlling expression of a while or do statement (6.8.5); each of the
expressions of a for statement (6.8.5.3); the expression in a return statement
(6.8.6.4).
— Immediately before a library function returns (7.1.4).
— After the actions associated with each formatted input/output function conversion
specifier (7.19.6, 7.24.2).
— Immediately before and immediately after each call to a comparison function, and
also between any call to a comparison function and any movement of the objects
passed as arguments to that call (7.20.5).
 
Во имя Ctrl, Alt и святаго Del. Enter!
 

Rada

опытный

2 Кирилл: причём ладно бы С так делал (ибо С специально был сделан, чтобы хер ломать), но когда это делается в плюсах... Невольно начинаешь понимать, почему этот язык умрёт в скором времени, не успев развиться. Нету унификации и формальности - тут так, там эдак.
С себя можно начать когда все остальное будет в порядке.  
+
-
edit
 

Balancer

администратор
★★★★★
trainer, 08.07.2004 10:06:55 :
Rada:
Приоритет ++ выше приориета +?
 
Приоритеты стандартом явно не определены. :)
 


Здрасьте!!

>Перегруженный оператор - функция. Вызов функции - sequence point. :)

В том-то и бред, что один оператор - функция, другой - нет. Идеологически - одно и то же. Практически - фиг. Это огромный минус любому языку.
 

Rada

опытный

Приоритеты стандартом явно не определены.
 
Ничего не понял - держу в руках книгу по ANSI C++, там перечислены все операторы, их степени, приоритеты, и ассоциативность.
С себя можно начать когда все остальное будет в порядке.  
RU Филич #08.07.2004 10:46
+
-
edit
 

Филич

втянувшийся

Кирилл
особенно прикольно, если позже операции присваивания
 

уважаемый, да вы смысла постфиксных операций не понимаете. именно после операции присванивания ему и место.

Balancer
В том-то и бред, что один оператор - функция, другой - нет. Идеологически - одно и то же. Практически - фиг. Это огромный минус любому языку.
 

перегруженный оператор - функция. вот и вся идеология.
кстати о птичках, то есть о сходстве:
Relations between operators, such as ++a meaning a+=1, are not guaranteed for overloaded operators (over.oper), and are not guaranteed for operands of type bool.
 

http://www.kuzbass.ru:8086/docs/isocpp/expr.html

а что по твоему "идеологически одно и тоже"? сходство синтаксиса?

существуют только два типа кораблей: подводные лодки и их цели
 
+
-
edit
 

Balancer

администратор
★★★★★
Филич, 08.07.2004 10:46:38 :
уважаемый, да вы смысла постфиксных операций не понимаете. именно после операции присванивания ему и место.
 


В таком случае, смысла постфиксных операций не понимает и весь остальной мир. В остальный C++ - подобных языках оператор ++ работает именно так. Инкремент сразу после извлечения значения. Как и в Си++ классах.
 
+
-
edit
 

Balancer

администратор
★★★★★
Филич, 08.07.2004 10:46:38 :
а что по твоему "идеологически одно и тоже"? сходство синтаксиса?
 


Не просто сходство, а прямо таки одинаковый синтаксис.
 
RU Филич #08.07.2004 12:04
+
-
edit
 

Филич

втянувшийся

Balancer
Инкремент сразу после извлечения значения. Как и в Си++ классах.
 

только потому что это функция.

В таком случае, смысла постфиксных операций не понимает и весь остальной мир
 

"весь остальной мир" перенял у С и под себя подправил. это личные трудности остального мира, что он не может понять неявного применения оператора.

сходство синтаксиса имхо не есть идеологическое сходство. хотя это уже такой вопрос... в общем по нему лучше не спорить :)
существуют только два типа кораблей: подводные лодки и их цели
 
+
-
edit
 

Balancer

администратор
★★★★★
Филич, 08.07.2004 12:04:30 :
только потому что это функция.
 


Даже когда компилятор оптимизирует вплоть до вставки сразу готового числа в код?

Чем такая "функция" отличается от "встроенного оператора"? Чёткое определение разницы, плиз :)

А то, вот, возьми C++ и C#.
Почему ++ в Си++ - оператор, а в C# - функция?
Если кодируются они в одно и то же по логике?

>"весь остальной мир" перенял у С и под себя подправил. это личные трудности остального мира, что он не может понять неявного применения оператора.

И только один поручик шёл в ногу :)

>сходство синтаксиса имхо не есть идеологическое сходство. хотя это уже такой вопрос... в общем по нему лучше не спорить :)

Вот поэтому Си++ и умрёт.
 
1 2 3 4 5 6

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru