Anudeep Jaiswal - MCA Ответов: 4

Преинкремент и постинкремент В С#


  int a = 10;
int c = a++ + a++ + ++a;
MessageBox.Show(a.ToString());
MessageBox.Show(c.ToString());


  int a = 10;
int c = a++ + a++ - ++a;
MessageBox.Show(a.ToString());
MessageBox.Show(c.ToString());


Что я уже пробовал:

Всем Привет,
После создания вышеуказанной программы предварительного инкремента и последующего инкремента,
Оба Кода Имеют Разное Решение В Соответствии С Концепцией C++.
Пожалуйста, Дайте Правильную Концепцию Для C#.

Philippe Mori

Вы должны были написать, что он показывает.

4 Ответов

Рейтинг:
2

OriginalGriff

Не делай этого.
Взгляните на этот ответ: Как работает выражение c= ++a + ++a;[^]


Maciej Los

Нет, это будет не так просто ;)

Philippe Mori

Ну, правила для C# хорошо определены, но это все равно плохая идея. Смотрите мой ответ.

OriginalGriff

Вот почему я сказал:"Не делай этого". :смеяться:

Рейтинг:
2

Philippe Mori

Ну, в C# правила более определены, чем в C++...

Инкремент в C#, C и C++[^]

В C#, вы сначала пример покажет 13 и 34 и второй пример покажет 13 и 8.

В C++ это было бы неопределенное поведение. Оба значения a и c будут неопределенными. На практике значение будет зависеть от порядка выполнения компилятором операций.

Компилятор C/C++ может по существу вычислить 3 подвыражения в любом порядке и может сохранить результат постфиксного оператора в любое время, а также может загрузить значение переменных из памяти один или несколько раз. Таким образом, как только одна и та же переменная будет изменена более одного раза в выражении без точки последовательности между двумя операциями, результат будет неопределенным.

На практике a, вероятно, будет 11, 12 или 13 в первом примере, а c-между 31 и 34, поскольку неопределенное поведение обычно является одной из возможных интерпретаций. Для второго примера c, вероятно, будет между 7 и 12.

Кстати, в C/C++ значение будет зависеть от компилятора,а часто и от оптимизации.

Обновление
Еще немного информации для C++: Точка последовательности-Википедия[^]


Рейтинг:
1

Patrice T

Вы находитесь в серой зоне. В определениях C/C++/C# указано, что компилятору разрешено изменять порядок элементов в выражении (и более), а поскольку ваше выражение зависит от порядка операций, результат не предсказуем. Другой компилятор даст другие результаты.

Используйте отладчик и отобразите сгенерированный ассемблерный код, чтобы увидеть, как был переведен ваш код.


Philippe Mori

Ну, правила для C# хорошо определены, но это все равно плохая идея. Смотрите мой ответ.

Рейтинг:
0

Bernhard Hiller

Простой ответ: используйте эти операторы инкремента только как отдельные операторы, никогда не объединяйте их с другими операторами! Это нисколько не замедлит работу вашей программы, компилятору все равно придется создавать дополнительные переменные. Единственное, что вы вызываете такими комбинациями, - это путаница.


Philippe Mori

Ну, правила для C# хорошо определены, но это все равно плохая идея. Смотрите мой ответ.