Программирование на C: + = vs = + - PullRequest
8 голосов
/ 16 февраля 2011

Мой профессор и я участвуем в дебатах об операторе + = в C. Он говорит, что + = или = + будет работать, но он не уверен, почему = + работает.

int main()
{
    int i = 0, myArray[5] = {1,1,1,1,1};

    while(i < 5)
    {
            myArray[i] += 3 + i;
            printf("%d\n", myArray[i]);
            i++;
    }

    system("pause");
}

В результате вы получите 4, 5, 6, 7, 8. Изменение оператора + = на = + даст те же результаты. Однако - = не делает то же самое, что и = - (что очевидно, поскольку рассматривает 3 как 3).

Итак, гуру:

  • Почему это работает с = +?
  • Как компилятор C обрабатывает = + против + =?

Ответы [ 4 ]

23 голосов
/ 16 февраля 2011

Он не прав;+= полностью отличается от =+.

Выражение x =+ 3 анализируется как x = (+3).
Здесь + становится (довольно бесполезным) унарным оператором +.(противоположность отрицанию)

Выражение x =- 3 анализируется как x = (-3) с использованием унарного оператора отрицания.

14 голосов
/ 16 февраля 2011

Ваш профессор помнит древние версии C, в которых =+, =-, =* и т. Д. Фактически означали то же самое, что и +=, -=, *= и т. д. (Мы говорим здесь старше, чем версия, обычно называемая здесь «K & R». Версия 6 UNIX, если память служит.)

В текущих версиях C они не означают одно и то же; Версии со знаком равенства сначала будут проанализированы так, как если бы между пробелами и тем, что будет после, был пробел. Это приводит к созданию действительной программы (хотя и не той, которая выполняет то, что вы ожидаете) для =- и =+, поскольку - и + могут использоваться в качестве унарных операторов.

=* или =/ могут быть использованы для урегулирования аргумента. a *= 3 умножит a на три, а a /= 3 разделит его на три, но a =* 3 - это семантическая ошибка (поскольку унарный * может применяться только к указателям), а a =/ 3 - синтаксическая ошибка (потому что / может не использоваться как унарный оператор).

3 голосов
/ 16 февраля 2011

Код

myArray[i] += 3 + i;

даст myArray[i] = myArray[i] + 3 + i;

, тогда как

myArray[i] =+ 3 + i;

даст myArray[i] = 3 + i

вот что я получил.1013 *

1 голос
/ 16 февраля 2011

+ также является унарным оператором, как и -.

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