2015-02-09 3 views
5

Я использовал SO некоторое время как ссылку, но никогда не задавал вопрос раньше. Я в настоящее время в классе C++ в колледже, а также читаю Программирование: Принципы и практика от Bjarne Stroutstrup только для моего собственного бенифита, так как я видел ответ на вопрос, который действительно рекомендовал его.Некоторая путаница с тем, как работают запятые в C/C++

В настоящий момент мы охватываем операторов в моем классе, и я просто не могу оборачивать голову тем, как оператор запятой работает в заявлении. Один пример - примерный вопрос для онлайн-части класса, который я продолжаю ошибаться, даже если я пишу программу на C и использую GDB для получения результата. Возникает вопрос:

Предполагая x == 16 перед следующим выражением, каково значение следующего выражения (не обязательно значение x)?

х ++, ++, х + = х

Я не заинтересован в правильном ответе столько о том, как получить правильный ответ. Я прочитал пару ответов на похожие вопросы, например, этот here, но похоже, что мне не хватает того, как это применимо, когда на самом деле нет оператора привязки. Это то же самое, как говорят

int y = (x++, ++x, x+=x); 

или

int y = x++, ++x, x+=x; 

или ни? Может ли кто-нибудь объяснить, как работает оператор запятой, в частности, в отношении заявления без назначения?

+4

@SouravGhosh Нет, оператор запятой вводит точку последовательности между ее операндами. Выражения секвенированы слева направо. – juanchopanza

+0

@KeithThompson Спасибо, сэр, за то, что вы меня исправили. –

+0

@juanchopanza Сэр, как-то я пропустил главу 6.5.17. Извини за это. Я стою исправлено. –

ответ

8

Оператор запятой простой - так легко трудно. Он имеет самый низкий приоритет для всех операторов; его приоритет еще ниже, чем операторы присваивания. Обратите внимание, что аргументы функций не разделяются оператором запятой.

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

В контексте:

x++, ++x, x += x; 

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

x++; 
++x; 
x += x; 

за исключением того, что общее значение является результатом x += x;.

Учитывая, что х начинается с 16, он увеличивается до 17, затем 18, а затем два раза до 36. Общее значение 36. Поэтому

Следует отметить, что из-за точек последовательности, он не работает фол правила о том, чтобы не увеличивать одну и ту же переменную более одного раза между точками последовательности.

Единственная причина использования запятой в том, что существуют контексты, в которых вы не можете использовать отдельные операторы, но вы можете использовать запятые. Например:

for (i = 0, j = n; i < j; ++i, --j) 

Вы не можете использовать точки с запятой вместо этих запятых.


В вопросе, есть два образца:

int y = (x++, ++x, x+=x); 

int y = x++, ++x, x+=x; 

Первый является законным (хотя излишне искаженным), и инициализирует y до 36 (и устанавливает x до 36).

Второй не является законным и не компилируется; запятые не являются операторами запятой и должны разделять различные деклараторы, но ++x и x += x не являются деклараторами. Однако если он был изменен на:

y = x++, ++x, x+=x; 

тогда это было бы законно. Первое слагаемое:

y = x++ 

, который назначает 16 до y и шага x до 17. приращений второго слагаемого x до 18; третий член меняет x на 36.

+1

[Klas Lindbäck] (http://stackoverflow.com/users/646887/klas-lindb% c3% a4ck) - спасибо за ваше редактирование; Я был частью пути добавления материала после правила, когда вы внесли изменения. Надеюсь, мое объяснение по крайней мере так же хорошо, как и ваше. Я уже заметил в самом верху ответа, что оператор запятой имеет еще более низкий приоритет, чем назначение. –

4

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

В вашем случае это означает, что у вас есть эта последовательность выражений оцененной

x++ // evaluates to 16, increments x to 17 
++x // increments x to 18, evaluates to 18 
x+=x // increments x by x, i.e. by 18, evaluates to 36. 

И полное выражение для третьего подвыражения. Первое выражение оценивается как 16, но увеличивает x до 17. Второй увеличивает x до 18 и оценивает это число. Третий увеличивает значение x на его значение 18 и оценивает до x, то есть составляет 36.

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