赋值运算符是C语言的运算符之一。赋值运算符用于为变量指定值,在C语言中,包括两类赋值运算符,一类是简单赋值运算符,将值直接赋给变量,另一类是复合赋值运算符,变量参与运算同时用运算结果更新变量的值。
简单赋值运算符
简单赋值运算符的使用形式为v = e
。e
可以是常量、变量或表达式。如果v
和e
的类型不同,在赋值过程中会发生类型转换,将e
的值转化为v
类型的值,然后赋给v
。
C语言中,赋值操作产生结果,结果就是v
的值。因此可以将赋值表达式作为操作数嵌入到其他表达式中,在表达式中是右结合的。但不建议这样使用,因为这会造成代码不易理解且可能会产生隐含错误。
=
用在变量的初始化时int v = e
,它不会产生结果,因此,这时它不是一个运算符,而是和所有元素一起组成了一个初始化语句。
赋值表达式左边的操作数必须是左值,即存储在计算机存储单元中的对象,不能是常量和计算结果。
复合赋值运算符
复合赋值运算符的使用形式为v op= e
,等价于v = v op e
。其中op可以是+
,-
,*
,/
,%
,&
,^
,|
,后三个为按位运算符。
自增和自减运算符
相对于i += 1
和i-= 1
,C语言提供了自增++
和自减--
运算符将这个语句进行更加简练的缩写i++, i--
。但是形式上的精简却并没有带来复杂性的简单,因为它们既可以做前缀运算符也可以做后缀运算符,在执行中具有不同的意义。++i
和--i
意味着立即自增或自减1,而i++
和i--
意味着先用i
的值进行计算,然后在下一条语句执行前在对i
自增或自减。后缀++
和--
比一元正负号优先级高,且都是左结合的,前缀++
和--
运算符和一元正负号优先级相同,且都是右结合的。
/***************************************
* assignment_operator.c *
* *
* C语言的赋值表达式 *
***************************************/
#include <stdio.h>
int main()
{
/*初始化*/
int i = 0;
int j = 0;
int k = 0;
float f = 72.99f;
/*简单赋值运算符*/
printf("i: %d\n", i);
i = 5;
printf("i: %d\n", i);
j = i;
printf("j: %d\n", j);
k = 10 * i + j;
printf("k: %d\n", k);
/*赋值过程中的类型转换*/
i = f;
printf("i: %d\n", i);
/*改变的变量的值的拷贝,原变量保持不变*/
printf("f: %f\n", f);
f = 136;
printf("f: %f\n", f);
/*赋值运算符嵌入表达式,右结合*/
i = j = k = 0;
printf("i = %d, j = %d, k = %d\n", i, j, k);
i = (j = (k = 1));
printf("i = %d, j = %d, k = %d\n", i, j, k);
k = 1 + (j = 1);
printf("k = %d\n", k);
/*复合赋值运算符*/
i += 2;
printf("i = %d\n", i);
/*自增和自减运算符*/
i = 1;
printf("i is %d\n", ++i);
printf("i is %d\n", i);
i = 1;
printf("i is %d\n", i++);
printf("i is %d\n", i);
i = 1;
printf("i is %d\n", --i);
printf("i is %d\n", i);
i = 1;
printf("i is %d\n", i--);
printf("i is %d\n", i);
return 0;
}
参考文献
- K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社