Операторы присваивания Операторы присваивания служат для вычисления значений выражений и присваивания вычисленных значений переменным. Оператор присваивания имеет вид: x = s; где x – имя переменной, s – выражение того же типа, = - знак присваивания. Оператор присваивания дает команду компьютеру на вычисление значения выражения справа от знака присваивания и запись вычисленного значения в ячейку памяти, отведенную для хранения переменной, стоящей слева от знака присваивания. При этом прежнее значение переменной аннулируется. Поэтому в программировании можно использовать, например, такие операторы присваивания: y = y + 5; Выполняя его, компьютер возьмет старое значение переменной y и увеличит его на 5, после чего полученное новое значение этой переменной снова запишет в отведенную для нее ячейку памяти. Начинающий программист может сделать ошибку, записав слева от знака присваивания не имя переменной, а константу или выражение: 10.5 = x; a + b = y + 5.2; В отличие от Паскаля, присваивание в Си может быть организовано несколькими способами: как оператор присваивания: a = 5; как оператор-выражение: a++; как операция, встречающаяся в выражении несколько раз, при этом операции присваивания выполняются справа налево: a = b = c = 5; как операция, если стоит внутри других операций: a = (b = 1) + 4; Сначала переменной b будет присвоено значение 1, а затем к результату, полученному в скобках, будет прибавлено 4.. a = (b = 1, c = 2) + 4; В этом случае сначала выполняются обе операции присваивания в скобках (перечисляются через запятые). Результат операций в скобках равен результату последней операции в них, то есть 2. После этого выполняются остальные операции в выражении, в данном случае операция сложения. Таким образом, одним оператором присваивания будут присвоены значения сразу трем переменным: b = 1, c = 2, a = 6 Операции присваивания, изменяющие старые значения переменных, реализуются в Си объединенными арифметическими или побитовыми операциями присваивания: исходный оператор объединенный оператор a = a + 5; a+=5; a = a – 3; a-=3; a = a * 4; a*=4; a = a / 6; a/=6; a = a % 2; a%=2; a = a + b / c; a+=b/c; a = a & 3; a&=3; a = a | 2; a|=2; a = a * b / c; a*=b/c; a = a * (b + c); a*=b + c; Эти операции, как и сама операция присваивания, имеют самый низкий приоритет и выполняются в выражениях последними справа налево, поэтому, например, замена a = a / b *c; на a/=b * c; будет неверна – получаются различные выражения. В операторах присваивания могут использоваться операции инкремента ++ и декремента --. Знаки инкремента и декремента могут стоять в выражениях как перед переменной (префиксная запись), так и после нее (постфиксная запись). При этом выражения будут вычисляться по-разному: при префиксной записи (знак перед переменной) сначала изменяется значение этой переменной, а затем выполняются другие операции, и последней – операция присваивания: a = 4; b = ++a; a=5, b=5 c = ++b/2; b=6, c=3 d = ++a/2; a=6, d=3 при постфиксной записи (знак после переменной) сначала вычисляется значение выражения со старыми значениями переменных, выполняется операция присваивания, после чего выполняются операции инкремента или декремента: a = 4; b = a++; b=4, a=5 c = b++/2; c=2, b=5 d = a++/2; d=2, a=6 В Си приветствуется присваивание начальных значений переменным при их описании – инициализация переменных: int i=5; float x=3.1415; char c=’A’; Инициализировать переменные можно и выражениями, операндами которых являются константы: int k=117*16; float x= 3.1415*2.0e-3; Если значения переменных целого или вещественного типов явно не заданы при их описании, то они автоматически инициализируются нулями. Примеры записи операторов присваивания: 1. int a=1; int b=2; int c=3; float x=2.0; a+= ++a / b++ % (c-= ceil(sqrt(x))); a=2 b=3 - ++a % (int) floor(sqrt(x)); a=3 b=6 c=1 b+= (a | c++) c=2 c|= --b % a--; a=2 b=5 c=2 2. int a=3; int b=2; int c=1; c+= --a / b++ + a % b; a=2 b=3 c=2 b|= ++a / (c+= b++, b+= a % c); a=3 b=7 c=5 a%= --a a=2 b=5 c=8 - ++b; 3. int a=0; int b=0; int c=0; c+= b++; a=0 b=1 c=0 b+= ++c % ('A' / '1' + 'A' % '1' % 5); a=0 b=2 c=1 a-= ++b c=2 - c++; a=-2 b=3