算术运算原创
运算的优先级,从高到低
:
一元运算 > 二元运算
逻辑非 ! >算术 > 逻辑与 &&、逻辑或 || > 赋值=
# 一元运算
# 取反取负
取反:!i
取负: -5
# ++ --
自增与自减,又分前后,其效果有差异!!!多用于循环。
int i=3,j=5,k;
printf("i=3,i++后的值不变: %d\n",i++);
printf("i++后下一次调用时值才变化为: %d\n",i);
printf("j=5,j--后的值不变: %d\n",j--);
printf("j--后下一次调用时值才变化为: %d\n",i);
printf("i=4,++i,值立刻改变,不用等到下一次调用 %d\n",++i);
printf("++i后下一次调用时值依旧为++i后的值: %d\n",i);
printf("j=4,--j,值立刻改变,不用等到下一次调用 %d\n",--j);
printf("--j后下一次调用时值依旧为--j后的值: %d\n",j);
int i=3,j;
// i++ i-- 同理
j=i++; // 拆分为 j=i; i++; j=3,i=4
printf("i=%d j=%d\n",i,j);
# 二元运算
# + - * / %
二元运算时,需要注意的是计算元素的数据类型是否一致,如果不一致的话,会系统会进行隐式转换(自动进行),转换成占内存字节数最大的操作数类型,自动转换顺序(由低向高)为:short,char->int->unsigned int->long int->unsigned long->float->double
。也可以手动进行显示转换(强制进行),根据需要将某一表达式的值的类型强制转换为用户指定的类型,格式为:`(数据类型)变量名或表达式。
// + - * 一样的操作
int i=3,j=5,k;
float f=1.25;
printf("隐式加法 d:i+j=%d\n",i+f); // 自动向高级转换,格式控制符错误,所以结果错误
printf("隐式加法 f:i+f=%f\n",i+f); // 自动向高级转换
printf("显式加法 d:i+f=%d\n",i + (int)f); // 强制转换float为int后进行计算
printf("显式加法 f:i+j=%f\n",(float)i + f); // 强制转换int为float后进行计算
printf("显式转换float:i+f=%f\n",(float)(i + f)); // 也可以对整个表达式进行转换
// / 除
printf("隐式除法:i/j=%d\n",i / j);// 值为float型,用%d控制输出,结果为 0 因为自动转为int 为什么??
printf("隐式除法:i/j=%f\n",i / j); // 结果为 0.000000 转为 float 型结果,并且结果也是错误的。 为什么???
printf("隐式除法 3.0:i/j=%f\n",3.0 / j); // 2个整型相除,想要float型结果,必须将其中一个墙转float型! 结果为 0.600000
printf("隐式除法 5.0:i/j=%f\n",i / 5.0); // 2个整型相除,想要float型结果,必须将其中一个墙转float型! 结果为 0.600000
printf("显式除法:i/j=%d\n",(float)i / j); // 显示结果为 5 错误,因为都是 float 型,但是却用了 %d 来控制
printf("显式除法:i/j=%f\n",(float)i / j); // 结果为 0.600000 因为没控制小数尾数,默认6位小数
printf("常量除法 d:i/j=%f\n",3.0 / j); // 结果为 0.600000
printf("常量除法 f:i/j=%d\n",3.0 / j); // 结果为 5
// & 取余
printf("取余:i%%j=%d\n",i % j); // 结果为 3 ,注意 “%%”是输出符号“%”
# 三元运算
不是算术算术运算,放在这里只是方便与“一元”、“二元”进行归类。三元运算更多用于条件判断。
判断表达式 ? 真值时内容 : 假值时内容
# 混合运算
优先级由高到低:
符号优先: ()
算法优先:* / % -> + -
上次更新: 2022/08/20, 00:50:36