4.1 算术运算符
① + 加法运算符; - 减法运算符; * 乘法运算符; / 除法运算符; % 求余运算符;
②以上二元运算符允许操作数是整数和浮点数两者混合,int型和float型混合为float型;
③ / 的结果会丢掉分数部分,eg 1 / 2 结果是0;
④ % 的操作数必须都是整数;
⑤ / 和 % 的右操作数不能为0;
⑥读取单个的数字,可采用 %1d转换说明的scanf函数;
4.2 赋值运算符
①表达式 v = e 的赋值效果是求出表达式 e 的值,并把此值复制给 v。e可以是常量、变量或更为复杂的表达式;
②如果 v 和 e 的类型不同,e 的值转化为 v 的类型;
③在C语言中,赋值就像 + 那样是运算符。换句话说,赋值操作产生结果,就如同两个数相加产生结果一样,赋值表达式 v = e 的值就是复制运算后 v 的值;因此 i = 72.99f的值是72而不是72.99;
int i;
float f;
i = 72.99f; //i is now 72
f = 136; //f is now 136.0
④由于存在类型转换,串在一起的赋值运算最终结果可能不是预期;
int i;
float f;
f = i = 33.3f; //首先把33赋值给i,然后把33.0(而不是预期的33.3)赋值给变量f
⑤左值:存储在计算机内存中的对象。 赋值运算符要求它的左操作数必须是左值,而不是常量、表达式或计算的结果;
⑥利用变量的原有值计算出新值并重新赋值给这个变量在C语言中是非常普遍的;
i = i + 2;
利用复合赋值运算符可改写为
i += 2;
v += e 表示v加上e,然后将结果存储到v中;
v -= e 表示v减去e,然后将结果存储到v中;
v *= e 表示v乘以e,然后将结果存储到v中;
v /= e 表示v除以e,然后将结果存储到v中;
v %= e 表示v除以e取余数,然后将结果存储到v中;
4.3 自增运算符和自减运算符
①简单理解, ++表示操作数加1,-- 表示操作数减1。++,--作为前缀时,意味立即自增或自减,++,--作为后缀时,意味着现在先用i的原始值,稍后再自增,“稍后”可大胆假设为在下一条语句执行前进行自增或自减;
i = 1;
printf("i is %d\n", --i); //i is 0
printf("i is %d\n", i--); //i is 0
i = 1;
printf("i is %d", i--); //i is 1
printf("i is %d", i); //i is 0
4.4 表达式求值
① 部分C语言运算符表
优先级 | 类型名称 | 符号 | 结合性 |
1 | (后缀)自增 | ++ | 左结合 |
(后缀)自减 | -- | ||
2 | (前缀)自增 | ++ | 右结合 |
(前缀)自减 | -- | ||
一元正号 | + | ||
一元负号 | - | ||
3 | 乘法类 | * / % | 左结合 |
4 | 加法类 | + - | 左结合 |
5 | 赋值 | = *= /= %= += -= | 右结合 |
②有了运算符和优先性和结合性规则我们可以将任何C语言表达式划分为子表达式。当子表达式改变了某个操作数的值时,产生的值可能就不一致了
a = 5;
c = (b = a + 2) - (a = 1);
在表达式中,即在某处访问变量的值又在别处修改它的值是不可取的,因此,不要在子表达式中使用赋值运算符,而是采用一串分离的赋值表达式
a = 5;
b = a + 2;
a = 1;
c = b - a;
③“取出”变量意味着从内存中获取它的值。变量的后续变化不会影响已取出的值,因为已取出的值通常存储在CPU中称为寄存器;
4.5 表达式语句
①C语言中任何表达式都可以作为语句,不论表达式是什么类型,计算什么结果,都可以通过在后面添加分号将其转换为语句;
②较低次整数幂用重复乘法运算的方式,计算非整数次幂,调用pow函数;
③ %运算符要求操作数是整数,不能用于浮点数。浮点数可用fmod函数;