Hiii все
Сегодня я сделал эту программу
int main()
{
int a = 1,2; /* Shows error */
int b = (1,2); /* No error */
}
Почему сначала каждый показывает ошибку, в то время как второй не делает? Просто () делает одну компиляцию программы. Почему?
- Shruti
(1,2)
вычисляет последнее выражение в списке, то есть 2
.
Другой пример: (a, b, c)
будет оцениваться как c
.
Если вы хотите использовать дробное число, используйте тип float / double и точку в качестве десятичного символа: double d = 1.2;
int a = 1,2;
2
рассматривается как имя переменной, которое не может начинаться с числа, отсюда ошибка.
int b = (1,2);
оператор запятая оценивает операнды слева направо и возвращает последнее выражение в списке, т.е. 2
Причина в том, что в вашем первом операторе int a = 1,2;
запятая не является оператором последовательности. Она является частью списка объявлений и пытается инстанцировать целочисленную переменную с именем 2
, что не разрешено языком.
Круглые скобки во втором выражении int b = (1,2);
заставляют запятую быть разобранной как оператор последовательности.
Внутри круглых скобок язык указывает, что будет иметь место выражение. В этом случае (b
) запятая представляет собой оператор запятой из языка C.
Без круглых скобок язык указывает, что объявления переменных разделяются запятыми. В примере a
компилятор (синтаксический анализатор) ожидает дополнительных объявлений переменных.
Ни одна из них не имела смысла для меня вначале.
Но потом я вспомнил о множественных операциях в циклах for. Например:
for (a=1,b=2; a<1; a++)
Зная, что 1 является допустимым выражением, и что выражения являются допустимыми элементами языка, я сделал вывод, что (1,2) оценивает 1 (но ничего с ней не делает), затем оценивает 2 и возвращает 2.
И наконец:
b = (1,2);
Что делает: оценивает 1 и 2, как и раньше, возвращает 2 и присваивает его b.