Почему следующий код не приводит к ошибке компиляции? - PullRequest
1 голос
/ 29 декабря 2011

Я использую компилятор VS2005, и я ожидаю, что следующий код выдаст ошибку компиляции.

int a=1, b= 2, c=3;
a = (b,c);

значение после присваивания равно 3. Насколько я понимаю, это должно дать ошибку компиляции.

Я был бы рад узнать, есть ли за этим веская причина.

Ответы [ 5 ]

6 голосов
/ 29 декабря 2011

Единственная ошибка в вашем коде состоит в том, что вы забыли точку с запятой в конце второй строки, но я предполагаю, что это была типографская ошибка при составлении вашего вопроса, а не фактическая направленность вашего вопроса.

Я не вижу причин, по которым код, который вы показали, должен вызывать ошибку компиляции.Он компилируется просто отлично для меня, и значение a фактически равно 3.

Убедитесь сами : следующий код возвращает 3:

int main()
{
    int a=1, b= 2, c=3;
    a = (b,c);

    return a;
}

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

Однако, как отмечает Charles Bailey , вы должны обернуть код, показанный в вопросе, внутри функции, иначе вы получите ошибки компиляции в любом компиляторе.C ++ не разрешает операторы присваивания вне функций.

5 голосов
/ 29 декабря 2011

Вы используете оператор запятой в C ++, он обычно не используется. Это работает следующим образом

<expression1>, <expression2>

Он оценивает <expression1> и отбрасывает результаты, а затем оценивает <expression2> и принимает полученный результат как значение всего выражения.

1 голос
/ 29 декабря 2011

Я только что проверил это на VS2005 и получаю ошибки компиляции, как и ожидалось.

Compiling...
main.cpp
d:\dev\work\comptest\main.cpp(2) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\dev\work\comptest\main.cpp(2) : error C2374: 'a' : redefinition; multiple initialization
        d:\dev\work\comptest\main.cpp(1) : see declaration of 'a'

Строка объявления в порядке, но, как и ожидалось, оператор присваивания недействителен вне функции. Компилятор, по-видимому, интерпретирует его как попытку повторно инициализировать a с типом по умолчанию int, ни один из которых не является допустимым.

1 голос
/ 29 декабря 2011

Цитировать http://en.wikipedia.org/wiki/Comma_operator:

"В языках программирования C и C ++ оператор запятой (представленный токеном) является двоичным оператором, который оценивает свой первый операнд и отбрасывает результат, а затем оценивает второй операнд и возвращает это значение (и тип) . Оператор запятой имеет самый низкий приоритет по сравнению с любым оператором C и действует как точка последовательности. "

1 голос
/ 29 декабря 2011

Нет ошибки в этом куске кода. Как вы думаете, почему должна быть ошибка компиляции? Все это оператор запятой , который оценивает все свои параметры, но возвращает самый правый: в данном случае 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...