Объединение составных операторов - PullRequest
3 голосов
/ 17 марта 2019

Я всего лишь обычный пользователь C, когда программирую для таких микросхем, как Arduino, но мне интересно улучшить мое понимание родного языка.

Я знаю, что вы можете сокращать такие вещи, как x = x % 10 до x %= 10 и x = x + 1 до x += 1. Но я не мог обернуть голову вокруг соединения обеих частей этого:

x = (x + 1) % 10

Если это возможно, как это выглядит? (x += 1) %= 10? Это кажется ... если не неправильно, то сбивает с толку.

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Выражение (x += 1) %= 10 недопустимо в C. Результат оператора присваивания, будь то = или одного из составных операторов присваивания, не является lvalue. Грубо говоря, это означает, что он не может появиться на левой стороне задания.

Это утверждение должно быть разбито на две части:

x += 1;
x %= 10;

Кроме того, (x += 1) %= 10 - это , действительный в C ++.

0 голосов
/ 20 марта 2019

Просто попробуйте x += 1; x %= 10; как альтернативу, она будет работать, но она не эквивалентна первому выражению.Вы не можете обернуть оба в одно выражение [1], так как

x op= expression;

означает

x = x op (expression);  /* look at the parenthesis */

, и это сначала вызывает оценку выражения.Единственный случай, когда

x = (x op1 a) op2 b;

может быть преобразован в операцию операционного присваивания, - это если операторы являются ассоциативными, а выражение может быть преобразовано в:

x = x op1 (a op2 b);

(или если op2 имеет более высокий приоритет, чем op1, что означает, что порядок оценки такой же, как указано выше), и тогда будет возможно

x op1= a op2 b;

.

Примеры

x = x + a + b;  ==>  x += a + b;  /* this implies a different order of evaluation */
x = x + a * b;  ==>  x += a * b;
x = x + a % b;  ==>  x += a % b;  /* % has higher precedence than + */

Примечание [1]: хорошо, вы можете, но с помощью другого оператора, оператора ,, вы можете преобразовать его в x += 1, x %= 10;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...