++ Разница в операторах C # и C ++ - PullRequest
14 голосов
/ 01 марта 2012

У меня есть следующий код, написанный на C ++ и C #

 int i=0;
 ++i = 11;

После этого компилятор C # выдает ошибку

The left-hand side of an assignment must be a variable, property or indexer

Но компилятор C ++ сгенерировал этот код без ошибок, и я получил результат 11 для значения i. В чем причина этой разницы?

Ответы [ 4 ]

42 голосов
/ 01 марта 2012

Разница в том, что оператор предварительного приращения равен lvalue в C ++, а не в C #.
В C ++ ++i возвращает ссылку на инкрементную переменную.В C # ++i возвращает увеличенное значение переменной i.
Так что в этом случае ++i равно lvalue в C ++ и rvalue в C #.

Из спецификации C ++ относительно оператора приращения префикса

Тип операнда должен быть арифметическим типом или указателем на полностью определенный тип объекта.Значение - это новое значение операнда;это lvalue .

PS оператор приращения постфикса i ++ не является lvalue как в C #, так и в C ++, поэтому эти строки кода приведут к ошибкеоба языка.

 int i=0;
 i++ = 11;
6 голосов
/ 01 марта 2012

Обратите внимание, что ++i = 11 вызывает неопределенное в C ++ 03, потому что вы изменяете i дважды без промежуточной точки последовательности.Однако, это хорошо определено в C ++ 11: сначала приращение, затем присваивание.

5 голосов
/ 01 марта 2012

C # и C ++ - это 2 совершенно разных языка и понятия.Они имеют только общее имя, потому что их синтаксис основан на C. Так что на самом деле «почему это работает на C #, но не на C ++» не имеет смысла как вопрос.Это то же самое, что сказать, почему таблица называется «table» на английском языке, а «mesa» на испанском.Потому что так было решено.

C # просто не допускает такой синтаксис.

В C ++ вы можете: сначала вычисляется ++i, что составляет i = 1,а затем 11 присваивается i, что составляет i = 11.

2 голосов
/ 01 марта 2012

семантика очень разная. В c ++ семантика заключается в том, что вы назначаете значение 11 для места хранения, обозначенного i. В C # семантика равна семантике следующего оператора

1=11

То есть это равносильно попытке присвоить значение 11 значению 1, которое компилятор C # не допускает. (Компиляторы Fortran действительно позволяют это, и это может создать адские сценарии отладки)

...