Аналогичный синтаксис, но один показывает ошибку, а другой нет - PullRequest
8 голосов
/ 14 августа 2010

Hiii all

Я сделал эту программу сегодня

int main()
{
   int a = 1,2; /* Shows error */
   int b = (1,2); /* No error */
}

Почему первый показывает ошибку, а второй нет?Just () выполняет компиляцию одной программы.Почему?

- Шрути

Ответы [ 5 ]

9 голосов
/ 14 августа 2010

int a = 1,2; 2 обрабатывается как имя переменной, которая не может начинаться с цифры, отсюда и ошибка.

int b = (1,2); оператор запятой вычисляет операнды слева направои возвращает последнее выражение в списке, т.е. 2

6 голосов
/ 14 августа 2010

Внутри скобок язык указывает, что произойдет выражение. В этом случае (b) запятая представляет оператор запятой из C.

Без скобок язык указывает, что объявления переменных разделяются запятыми. В примере a компилятор (синтаксический анализатор) ожидает объявления дополнительных переменных.

3 голосов
/ 14 августа 2010

Причина в вашем первом утверждении int a = 1,2; Запятая не анализируется как оператор последовательности. Он является частью списка объявлений и пытается создать целочисленную переменную с именем 2, которая не разрешена языком.

Скобки во втором операторе int b = (1,2); заставляют запятую анализироваться как оператор последовательности.

0 голосов
/ 14 августа 2010

Никто из них не имел смысла для меня в кулак.

Но потом я вспомнил несколько операций для циклов. Например:

for (a=1,b=2; a<1; a++)

Зная, что 1 является допустимым выражением и что выражения являются допустимыми языковыми элементами, я пришел к выводу, что (1,2) оценивает 1 (но ничего с этим не делает) затем оценивает 2 и возвращает 2.

И наконец:

b = (1,2);

Что значит оценить 1 и 2, как и раньше, вернуть 2 и присвоить его b.

0 голосов
/ 14 августа 2010

(1,2) соответствует последнему выражению в списке, т.е. 2.

Другой пример: (a,b,c) оценивается как c.

Если вы хотите использовать дробное число, используйте тип с плавающей запятой / double и точку в качестве десятичного знака: double d = 1.2;

...