Есть ли подмножество C можно написать так: i = + 1 - PullRequest
9 голосов
/ 06 января 2010

Я помню, как читал книгу, в которой говорил о стандартном языке программирования Си. Он сказал, что в некотором роде C вы можете написать i = + 1, что равно i + = 1. Итак, i (оператор) = (выражение) равно i = (оператор) (выражение). Я никогда не вижу такого рода C, есть кто-то, кто может это объяснить?

С уважением и благодарностью, Вентилятор

Ответы [ 6 ]

22 голосов
/ 06 января 2010

Это был очень очень начальный синтаксис для оператора + = в C. Я думаю, что он не рекомендуется даже до первого издания книги K & R.

РЕДАКТИРОВАТЬ: PDF-файл со справочным руководством C можно найти здесь: http://www.math.utah.edu/computing/compilers/c/Ritchie-CReferenceManual.pdf посмотрите на 7.14.1

(Увы, опубликованный AnT больше не действителен)

14 голосов
/ 06 января 2010

Это правда. Эта версия C называется CRM C (CRM означает «Справочное руководство C» - документ, написанный Деннисом Ритчи). В этой версии C. есть много странных вещей.

Вы можете скачать документ здесь http://cm.bell -labs.com / cm / cs / who / dmr / cman.pdf

8 голосов
/ 06 января 2010

Kernighan и Ritchie's Язык программирования C , первое издание объясняет это. Я нашел цитату в в этом сообщении comp.lang.c. Часть цитаты:

Поскольку C является развивающимся языком, некоторые устаревшие конструкции могут быть найдено в старых программах. Хотя большинство версий компилятора поддерживают такие анахронизмы [- как 1978--], в конечном итоге они исчезнут, оставляя только проблему переносимости.

Более ранние версии C использовали форму =op вместо op= для назначения операторы. Это приводит к двусмысленности, типичной для

x=-1

, который на самом деле уменьшается x, поскольку = и - смежны, но который может быть легко назначен для -1 на x.

Википедия также имеет похожее описание. С их запись для C , говорящая о различиях K & R C и "Old C":

составные операторы присваивания вида =op (такие как =-) были изменены на форму op=, чтобы удалить семантическую неоднозначность, создаваемую такими конструкциями, как i=-10, которая интерпретировалась как i =- 10 из возможных i = -10.

1 голос
/ 06 января 2010

Скорее всего, возникнут проблемы, если вы захотите присвоить переменной отрицательное число. Что решает, что вы имеете в виду тогда? Расстояния? (EW!) Или скобки (двойной EW!). Вот несколько примеров, показывающих проблемы

i = -1; //Is this any different from the line below? Since when have spaces in these kind of cases mattered?
i =- 1; //If the suggested syntax existed, what would these two lines mean?

//The only thing left now (if we rule out making spaces matter) is to use parenthetis in my eyes, but...

i =(-1); //This is just ugly

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

0 голосов
/ 06 января 2010

Немного пробелов может помочь прояснить это для вас.

Когда вы пишете i=+1, на самом деле происходит i = +1. Это связано с тем, что в C. нет оператора = +. = рассматривается как собственный оператор, а + - унарный оператор, действующий на константу 1. Таким образом, оценка этого оператора начинается с правой стороны оператора =. +1 оценивается как 1, а оператор = затем присваивает это значение переменной i.

+= - это собственный оператор в C, который означает «добавить значение выражения в правой части этого оператора в переменную в левой части и присвоить его этой переменной, что-то вроде следующего:


i = 3;
i += 2;

будет иметь значение 5, потому что оператор += будет вычислять правую часть оператора (в данном случае 2, и добавит его в левую часть (в этом случае значение i равно 3 ) и присвоит его переменной слева. По сути, это становится i = (2 + 3). Поэтому переменная i будет иметь окончательное значение 5.

Если вы просто добавляете значение 1 к целочисленной переменной, вы можете использовать вместо этого оператор ++. Добавление этого оператора после переменной (то есть i++) приведет к выполнению текущей строки кода перед тем, как увеличит переменную на единицу. Префикс оператора перед переменной приведет к выполнению оператора после приращения переменной.

например:.


i = 5;
j = i++;

приведет к i = 6 и `j = 5 ', тогда как


i = 5;
j = ++i;

приведет к i = 6 и j = 6.

Аналогично, оператор -- может использоваться для уменьшения (уменьшения) переменной на единицу, подобно тому, как ++ будет увеличивать (увеличивать) переменную на единицу. Одинаковые правила, касающиеся позиционирования оператора до или после переменной, применяются к обоим операторам.

Надеюсь, это немного прояснит ситуацию.

0 голосов
/ 06 января 2010

Это не C. В стандарте C это эквивалентно i=1. Может быть, вы ищете i++?

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