七、++和–操作符
(一)、初步了解
让代码run起来!
//前置++(先对a自增再使用) #include <stdio.h> int main() { int a = 10; int b = ++a; printf("%d,%d\n", a, b); return 0; }//输出结果:11 11
#include <stdio.h> //后置++(先使用再对a自增) int main() { int a = 10; int b = a++; printf("%d,%d\n", a, b); return 0; }//输出结果:11 10
(二)、深入理解后置++
还是用代码看现象
#include <stdio.h> int main() { int a = 8; int b = a++; return 0; }
来看这段代码的反汇编:
这样就能很好的理解为什么是先使用再自增了。
#include <stdio.h> int main(0 { int a = 8; a++;//并没有使用 return 0; }
再来看这段代码的反汇编:
(三)、复杂表达式
#include <stdio.h> int main() { int i =1; int j = (++i)+(++i)+(++i); printf("%d\n",j); return 0; }
这段代码在visual studio 2022中输出结果是12,在gcc中输出结果是10。不同的编译器有不同的计算规则。
贪心算法(表达式匹配问题)
编译器依据符号自动匹配表达式。
在visual studio 2022中,我们每输完一条语句时,当我们打上分号,按下回车换行(enter)键时,编译器会自动匹配表达式。
八、取模/取余运算问题
(一)、取整问题
通过代码看现象。run起来!
1.向0取整
#include <stdio.h> int main() { int i = -2.9; int j = 2.9; printf("%d\n", i);//输出结果是-2 printf("%d\n", j);//输出结果是2 return 0; }
看图:
c语言中默认是向0取整。
c语言中有一个trunc取整函数:
通过代码了解:
可见trunc函数是一个向0取整函数。
2.向负无穷取整
floor函数就是一个向负无穷取整的函数。
初步了解:
通过代码进一步了解:
也可以这么理解:
3.向正无穷取整
ceil函数就是一个向正无穷取整函数。
先对ceil函数进行初步认识:
通过代码来看:
可以这么理解ceil函数:
4.四舍五入
round函数就是一个四舍五入函数。
初步了解:
通过代码来理解:
5.综合
源代码:
#include <stdio.h> #include <math.h> int main() { const char* format = "%.1f \t%.1f \t%.1f \t%.1f \t%.1f\n"; printf("value\tround\tfloor\tceil\ttrunc\n"); printf("-----\t-----\t-----\t----\t-----\n"); printf(format, 2.3, round(2.3), floor(2.3), ceil(2.3), trunc(2.3)); printf(format, 3.8, round(3.8), floor(3.8), ceil(3.8), trunc(3.8)); printf(format, 5.5, round(5.5), floor(5.5), ceil(5.5), trunc(5.5)); printf(format, -2.3, round(-2.3), floor(-2.3), ceil(-2.3), trunc(-2.3)); printf(format, -3.8, round(-3.8), floor(-3.8), ceil(-3.8), trunc(-3.8)); printf(format, -5.5, round(-5.5), floor(-5.5), ceil(-5.5), trunc(-5.5)); return 0; }
(二)、取模问题
1.取模概念
如果a和d两个自然数,d非零,可以证明存在两个唯一的整数q和r,满足a=q*d+r且0<=r< d,其中,q被称为商,r被称为余数。
2.负数取模
#include <stdio.h> //visual stuio2022中 int main() { int a = -10; int d = 3; printf("%d\n", a / d);//输出-3 printf("%d\n", a % d);//输出-1 return 0; }//满足-10=(-3)*3+(-1)
用python环境下,-10%3=-4,-10/3=2,。不同的编译器有不同的计算规则。
3.取余和取模一样吗?
取余:尽可能让商,进行向0取整。
取模:尽可能让商,向负无穷大取整。
4.计算数据同符号
利用上述a=q*d+r很好理解。不需要讲解了。
5.计算数据不同符号
这也一样,利用上述a=q*d+r很好理解。
结论:如果参与取余的数据同符号,取模等价于取余;如果参与取余的两个数据符号不同,在c语言中(或者其他采用向0取整)余数符号和被除数相同。
九、运算符优先级问题
这个图表就没什么好讲的了,一目了然!