Подтвердить что ты не робот

Что означает = + в C?

Я встретил =+ в отличие от стандартного += сегодня в некотором C-коде; Я не совсем уверен, что происходит здесь. Я также не мог найти его в документации.

4b9b3361

Ответ 1

В древних версиях C, =+ был эквивалентен +=. Остатки его были найдены вместе с самыми ранними костями динозавров. Более того, это не имеет особого значения - это просто a =, за которым следует +.

Ответ 2

Вы можете найти доказательства старой нотации в 7-м издании UNIX Manual (том 2a) от января 1979 года, доступном в Интернете по адресу http://cm.bell-labs.com/7thEdMan/ (недоступно примерно с июля 2015 года; версия от июня 2015 года; теперь доступно через WayBack Machine по адресу http://cm.bell-labs.com/7thEdMan/ - или по адресу https://9p.io/7thEdMan/).

Глава называется "Справочное руководство по C" Денниса М. Ритчи и находится в PDF-версии руководства, но не в HTML-версии. В соответствующей части говорится:

7.14.1 lvalue = выражение

Значение выражения заменяет значение объекта, на который ссылается lvalue. Операнды не обязательно должны иметь одинаковый тип, но оба должны быть int, char, float, double или указатель. Если ни один из операндов не является указателем, присваивание происходит, как и ожидалось, возможно, с предшествующим преобразованием выражения справа. Когда оба операнда являются int или указателями любого вида, преобразование никогда не происходит; значение выражения просто сохраняется в объекте, на который ссылается lvalue. Таким образом, можно генерировать указатели, которые будут вызывать исключения при использовании.

7.14.2 lvalue = + выражение
7.14.3 lvalue = - выражение
7.14.4 lvalue = * выражение
7.14.5 lvalue =/выражение
7.14.6 lvalue =% выражение
7.14.7 lvalue =>> выражение
7.14.8 lvalue = << выражение
7.14.9 lvalue = & выражение
7.14.10 lvalue = ^ выражение
7.14.11 lvalue = | выражение

Поведение выражения вида '' E1 = op E2 может быть выведено, если принять его эквивалентным '' E1 = E1 op E2; однако E1 оценивается только один раз. Более того, выражения типа '' я = + p, в которых указатель добавляется к целому числу, запрещены.


Отдельно есть статья "Эволюция С" Л. Рослера в "UNIX® SYSTEM: Чтения и приложения, том II", первоначально опубликованная AT & T в качестве технического журнала за октябрь 1984 г., позднее опубликованная в 1987 г. Прентис-Холл ( ISBN 0 -1 3-939845-7). Один из разделов этого:

III. Управление несовместимыми изменениями

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

Например, в самых ранних реализациях неоднозначное выражение x=-1 интерпретировалось как означающее "уменьшение x на 1". Теперь оно интерпретируется как "присвоить значение -1 x". Это изменение произошло в течение трех ежегодных основных выпусков. Сначала компилятор и верификатор программы lint были изменены, чтобы сгенерировать сообщение, предупреждающее о наличии "старомодной" операции присваивания, такой как =-. Затем парсеры были изменены на новую семантику, и компиляторы предупредили о неоднозначной операции присваивания. Наконец, предупреждающие сообщения были устранены.

Поддержка использования "старомодной инициализации"

int x 1;

(без знака равенства) был отброшен по аналогичной стратегии. Это помогает анализатору производить более интеллектуальную диагностику синтаксических ошибок.

Как и ожидалось, некоторые пользователи C игнорировали предупреждения до тех пор, пока введение несовместимых компиляторов не заставило их выбирать между изменением устаревшего исходного кода или принятием обслуживания своих версий компилятора. Но в целом стратегия поэтапных изменений была успешной.

Ответ 3

Это просто назначение, за которым следует унарный плюс.

#include <stdio.h>
int main() {
    int a;
    a =+ 5;
    printf("%d\n",a);
    return 0;
}

Печать "5". Измените a =+ 5 на a =- 5 и напечатайте "-5". Более простой способ читать a =+ 5 - это, вероятно, a = +5.

Ответ 4

Это древний несуществующий вариант +=. В современных компиляторах это эквивалентно оператору присваивания, за которым следует унарный символ +.

Ответ 5

Я думаю,

a =+ 5;

должен быть эквивалентен

a = (+5);

и, следовательно, код очень плохого стиля.

Я попробовал следующий код и напечатал "5":

#include <iostream>
using namespace std;

int main()
{
    int a=2;
    a =+ 5;
    cout << a;
}

Ответ 6

После прочтения вашего вопроса я только что исследовал их. Позвольте мне рассказать вам, что я нашел. Пробовал это на gcc и turboc. Не уверен, что в Visual Studio, поскольку я не установил его на моем ПК

  int main()
  { 
   int a=6;
   a =+ 2;
   printf("%d",a);
  }  o/p , a value is 2

  int main()
  {
   int a=6;
   a =- 2;
   printf("%d",a);
  } o/p , a value is -2 

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

  int main()
  { 
   int a=6;
   a =* 2;  \\ Reporting an error inavlid type of argument of unary *
   printf("%d",a);
  } 
 if *= is equal to =* then it should not report error but its throwing an error