Ошибки, баги, вопросы - страница 3610

 
Artyom Trishkin #:

Давай исходить из правил.

Раз: i = 5;

Два: 5 *= 5 = ??? (25 же)

Раз: j = 5;

Два: j = 5 * 5 = 25

Откуда остаётся значение 2, если в первую очередь переменным присваивается значение 5?

Читай источник

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2025.01.18 10:25

В С++ аналогично?
void OnStart()
{ 
  int i = 2;
  int j = 2;
  
  Print(i *= (i = 5));    // 25
  Print(j = j * (j = 5)); // 10
}
Думал, что эти записи идентичны.

 
Alexey Viktorov #:

Читай источник


Читай полностью вопрос:

Откуда остаётся значение 2, если в первую очередь переменным присваивается значение 5?
 
fxsaber # :
В С++ аналогично? Думал, что эти записи идентичны.

И да, и нет. Это зависит от компилятора, поскольку порядок, в котором вычисляются операнды умножения, НЕ фиксирован.

https://ru.cppreference.com/w/cpp/language/eval_order

 
Alain Verleyen #:

И да, и нет. Это зависит от компилятора, поскольку порядок, в котором вычисляются операнды умножения, НЕ фиксирован.

https://ru.cppreference.com/w/cpp/language/eval_order

Спасибо. Но все же хотелось бы несколько результатов от известных компиляторов.

 
fxsaber #:

Спасибо. Но все же хотелось бы несколько результатов от известных компиляторов.

                

 
Alain Verleyen #:

И да, и нет. Это зависит от компилятора, поскольку порядок, в котором вычисляются операнды умножения, НЕ фиксирован.

https://ru.cppreference.com/w/cpp/language/eval_order

Это совсем о другом. Вычисляться они могут в любом порядке, а вот складываться, согласно примера, только по правилам арифметики. Исключительно слева неправо…

Artyom Trishkin #:

Читай полностью вопрос:

Артём, вариант с переменной i будет выглядеть так:

Сначала переменная идентифицируется значением 2. Затем оператор *= говорит о том, что переменной надо присвоить значение умноженное себя на что-то. А там, в этом «что-то» присваивается новое значение и это новое значение умножается на это «что-то». То-есть само на себя.

А вот с j получается так:

Сначала идентификация значением 2. Затем 2 умножается на ……… и тут, можно сказать не идентификация, а присвоение нового значения переменной. 

А собственно, если будут другие вразумительные объяснения, я готов их принять безоговорочно…

 
Alain Verleyen #:     

Спасибо еще раз. Сам я рассуждал так, чтобы оба выражения были равны 10. Смотрю, что первое на всех компиляторах всегда 25.

 
Alexey Viktorov #:

Это совсем о другом. Вычисляться они могут в любом порядке, а вот складываться, согласно примера, только по правилам арифметики. Исключительно слева неправо…

Артём, вариант с переменной i будет выглядеть так:

Сначала переменная идентифицируется значением 2. Затем оператор *= говорит о том, что переменной надо присвоить значение умноженное себя на что-то. А там, в этом «что-то» присваивается новое значение и это новое значение умножается на это «что-то». То-есть само на себя.

А вот с j получается так:

Сначала идентификация значением 2. Затем 2 умножается на ……… и тут, можно сказать не идентификация, а присвоение нового значения переменной. 

А собственно, если будут другие вразумительные объяснения, я готов их принять безоговорочно…

Выражение в скобках должно считаться первым по мат.правилам?

Если так, то каков порядок расчёта, и при чём тут инициализирующее значение, которое в первую же очередь заменяется значением 5 ?

 
Artyom Trishkin #:

Выражение в скобках должно считаться первым по мат.правилам?

Если так, то каков порядок расчёта, и при чём тут инициализирующее значение, которое в первую же очередь заменяется значением 5 ?

Видимо я не смогу объяснить так, чтобы было понятно…

Вот смотри… Казалось бы переменной уже присвоено новое значение, ан нет, пока ещё j равна 2


 
Alexey Viktorov #:

Видимо я не смогу объяснить так, чтобы было понятно…

Я прекрасно понял ход твоих мыслей.

Не понял какое участие в них имеет инициализирующее значение при условии, что оно сразу же должно заменяться значением 5