赋值运算符是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
自增或自减。后缀++
和--
比一元正负号优先级高,且都是左结合的,前缀++
和--
运算符和一元正负号优先级相同,且都是右结合的。
1 |
<span class="hljs-preprocessor">#include <stdio.h></span> <span class="hljs-keyword">int</span> main() { <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; <span class="hljs-keyword">int</span> j = <span class="hljs-number">0</span>; <span class="hljs-keyword">int</span> k = <span class="hljs-number">0</span>; <span class="hljs-keyword">float</span> f = <span class="hljs-number">72.99f</span>; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i: %d\n"</span>, i); i = <span class="hljs-number">5</span>; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i: %d\n"</span>, i); j = i; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"j: %d\n"</span>, j); k = <span class="hljs-number">10</span> * i + j; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"k: %d\n"</span>, k); i = f; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i: %d\n"</span>, i); <span class="hljs-built_in">printf</span>(<span class="hljs-string">"f: %f\n"</span>, f); f = <span class="hljs-number">136</span>; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"f: %f\n"</span>, f); i = j = k = <span class="hljs-number">0</span>; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i = %d, j = %d, k = %d\n"</span>, i, j, k); i = (j = (k = <span class="hljs-number">1</span>)); <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i = %d, j = %d, k = %d\n"</span>, i, j, k); k = <span class="hljs-number">1</span> + (j = <span class="hljs-number">1</span>); <span class="hljs-built_in">printf</span>(<span class="hljs-string">"k = %d\n"</span>, k); i += <span class="hljs-number">2</span>; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i = %d\n"</span>, i); i = <span class="hljs-number">1</span>; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i is %d\n"</span>, ++i); <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i is %d\n"</span>, i); i = <span class="hljs-number">1</span>; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i is %d\n"</span>, i++); <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i is %d\n"</span>, i); i = <span class="hljs-number">1</span>; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i is %d\n"</span>, --i); <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i is %d\n"</span>, i); i = <span class="hljs-number">1</span>; <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i is %d\n"</span>, i--); <span class="hljs-built_in">printf</span>(<span class="hljs-string">"i is %d\n"</span>, i); <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>; } |
参考文献
- K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社