Почему эта двойная инициализация с запятой незаконна? - PullRequest
5 голосов
/ 15 декабря 2011

У меня есть три фрагмента кода. Вот этот:

1,7; //yes, that's all the code

компилируется нормально. Вот этот:

double d = (1, 7);

тоже компилируется нормально. И все же этот:

double d = 1, 7;

не компилируется. gcc-4.3.4 говорит

ошибка: ожидаемый неквалифицированный идентификатор перед числовой константой

и Visual C ++ 10 говорит

ошибка C2059: синтаксическая ошибка: «константа»

Почему такая разница? Почему не все три компилируются с ,, имеющим одинаковый эффект во всех трех?

Ответы [ 4 ]

13 голосов
/ 15 декабря 2011

В первых двух случаях операторы используют оператор запятой C ++

В последнем случае запятая используется в качестве отдельной переменной, и компилятор ожидает, что вы объявите несколько идентификаторов; запятая здесь не используется как оператор.

Последний случай похож на что-то вроде:

float x,y;
float a = 10, b = 20;

Когда вы делаете это:

double d = 1, 7;

Компилятор ожидает идентификатор переменной, а не числовую константу. Следовательно, 7 здесь незаконно.

Однако, когда вы делаете это:

double d = (1,7);

используется обычный оператор запятой: 1 оценивается и отбрасывается, а 7 сохраняется в d.

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

Разница в том, что в 1, 7; и (1, 7) есть выражения, в которых допускается оператор запятой.

Ваш последний пример

double d = 1, 7; 

- это объявление, в котором запятая - не оператор, а разделитель. Компилятор выдает что-то вроде

double d = 1, e = 7; 

, что будет правильным объявлением переменной.

Обратите внимание, что запятая иногда является оператором (в выражениях), но также используется в качестве разделителя в других местах, например списках параметров в объявлениях функций.

3 голосов
/ 15 декабря 2011
  1. double d = (1, 7); Здесь (1, 7) будет оцениваться первым;запятая работает как оператор последовательной оценки , а 7 будет присвоено d.

  2. double d = 1, 7; В этом случае возникает проблема: часть перед запятой означает, что вы объявляете double и устанавливаете его значение, но часть после запятой имеет значение бессмысленно , потому что это всего лишь одна целочисленная константа.

0 голосов
/ 15 декабря 2011

Я полагаю, это потому, что последний обрабатывается как (неправильная) строка объявления: (double d = 1), (7)

...