2016-02-08 6 views
3

В языке программирования C, о назначении 4,3 к переменной целочисленного типа, как:С типом данных декларации запроса

int a; 

a = 4,3; 

переменной принимает значение слева от запятой (т.е. a установлен в 4 в примере). При присвоении в скобки список, однако, как

a = (4,3); 

, переменная принимает последнее значение в запятую (3 в примере).

В чем причина этого?

+2

Можете ли вы опубликовать код, который вы используете для тестирования? –

ответ

1

Да. Это будет правильная операция.

i = (a, b);    // stores b into i 
          // ... a=1, b=2, c=3, i=2 
    i = a, b;    // stores a into i. Equivalent to (i = a), b; 
          // ... a=1, b=2, c=3, i=1 

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

+0

Вы правы, но вы не совсем связали точки. Было бы полезно объяснить, почему круглые скобки имеют значение. –

+0

Что означает '-wiki'? Есть много вики ... – Wolf

3

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

В качестве оператора сначала запятая оценивает левый операнд, а затем оценивает его правый операнд. Значение общего выражения является вторым результатом. Это в некотором роде дополняет операторы && и ||, оба из которых сначала оценивают свои левые операнды, но каждый из них оценивает свой правый операнд только условно, в зависимости от левого результата.

Другой ключ к пониманию вашего наблюдения заключается в том, что знак равенства (=) равен также оператор. Он оценивает оба операнда в неуказанном порядке, и его результат совпадает с правым операндом. Изменение значения левого операнда является побочным эффектом.

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

a = 4,3; 

... эквивалентно ...

(a = 4), 3; 

. Сначала он оценивает назначение, получая значение 4 с побочным эффектом присвоения этого значения переменной a. Затем он отбрасывает это значение и оценивает 3, что дает значение 3 в качестве общего результата. Поскольку все это не является частью какого-либо большего выражения, результат отбрасывается.

С другой стороны, вы можете изменить приоритет с соответствующим использованием скобок, так как в этом:

a = (4, 3); 

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

+0

Хорошее объяснение. BTW 'оператор с запятой имеет самый низкий приоритет для всех' - если вы рассматриваете'; 'как оператор (я знаю, что это неправильно, но только для иллюстрации), тогда сначала оценивается запятая. Вот почему 'return' берет последнее значение списка, разделенного запятыми. https://ideone.com/819cWn – Wolf

+2

@Wolf ';' не является оператором. Кроме того, в 'return 4,3;' запятая является оператором, а не разделителем. В списке, разделенном запятыми, нет последовательности, например. 'f (a(), b());' могут вызывать 'a' и' b' в любом порядке. –

0

C/C++, Оператор comma (,) вычисляется слева направо, а значение левого выражения отбрасывается. Тип и значение результата - это тип и значение правильного операнда. Все побочные эффекты от оценки левого операнда завершены до начала оценки правильного операнда. Взято из книги KR A.7.18

Кроме того, оператор запятой имеет наименее приоритет и порядок оценки.

Оператор: = Оператор имеет более высокий приоритет, чем , Оператор. В нижеследующем отчете

int a; 
a = 4,3; 

Назначение происходит сначала в результате a = 4.

, а также, как мы все знаем, () переопределяет precedence, поэтому мы имеем a = 3 в случае

int a = (4,3); 

Теперь мы все поняли теорию , и =, Сосредоточимся, когда использовать ,. Оператор запятой следует использовать экономно. Наиболее подходящие применения для конструкций сильно связаны друг с другом., например, в for loop

for (i = 0, j = strlen(s)-1; i < j; i++, j--) 

Везде, где это возможно, я буду использовать () в сочетании с ,

+1

'int a = 4,3;' плохо сформирован. OP спрашивал о 'int a; a = 4,3; 'и' a = (4,3); '. –

+0

Моя ошибка, спасибо, что указали это. Не возражаете ли вы пересмотреть это – dlmeetei

Смежные вопросы