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

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

46 голосов
/ 27 сентября 2011

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

Ответы [ 6 ]

73 голосов
/ 27 сентября 2011

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

34 голосов
/ 28 сентября 2011

Вы можете найти свидетельство старой нотации в 7-м издании UNIX Manual (том 2а) от января 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= выражение

Значение выражения заменяет значение объекта, на который ссылается l-значение. Операнды не обязательно должны иметь один и тот же тип, но оба должны быть типом int, char, float, double или указателем.операнд - указатель, присваивание происходит, как и ожидалось, возможно, предшествует преобразованию выражения справа. Когда оба операнда являются int или указателями любого вида, преобразование никогда не происходит; значение expРецессия просто сохраняется в объекте, указанном в 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 = << выражение <br>7.14.9 lvalue = & выражение
7.14.10 lvalue = ^ выражение
7.14.11 lvalue = |expression

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


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

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

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

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

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

int x 1;

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

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

12 голосов
/ 27 сентября 2011

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

#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.

9 голосов
/ 27 сентября 2011

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

6 голосов
/ 27 сентября 2011

Я думаю

a =+ 5;

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

a = (+5);

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

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

#include <iostream>
using namespace std;

int main()
{
    int a=2;
    a =+ 5;
    cout << a;
}
0 голосов
/ 28 сентября 2011

После прочтения вашего вопроса я только что исследовал их.Позвольте мне рассказать вам, что я нашел.Пробовал на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...