但现在,我不再畏惧。-Faker《不死者》
---
运算符(符号)、算子(进行计算的量)
C语言,开始的时候是用的打字机,打字机没有乘除号,所以用星号*和右斜杠/分别代表乘,除。这样就有了加减乘除四则运算。
另外特殊的取余操作,用的百分号%,取余获得两个数相除的余数。C=A%B;
思考问题:计算时间差,给出两个时刻,计算他俩的时间差。
当我们在一个问题怎么用计算机解决时,思考两个问题?
1.数据(保存)
我们处理的时候,会得到什么样的数据?我们输入的数据是怎样的?(所以,想我们程序里需要什么样的变量,怎么把输入的变量保存下来,怎么把输出的结果保存下来,数据保存)
2.计算(方法)
我们得到输入的数据之后,怎么进行计算?(算法,方法)
---
整数计算是有好处的,计算两时刻的时间差,可以把时刻变成分钟,两个分钟数相减得到整数,再把整数对60取余计算,余数是分钟,整数是小时。妙~
数据有多又少,计算的方法有简单,有复杂。
运算法的优先级
优先级 | 运算符 | 运算 | 结合关系 | 举例 |
1 | + | 单目不变 | 自右向左 | +c、a*+b |
1 | - | 单目取负 | 自右向左 | -c,a*-b |
2 | * | 乘 | 自左向右 | a*b |
2 | / | 除以 | 自左向右 | a/b |
2 | % | 取余 | 自左向右 | a%b |
3 | + | 加 | 自左向右 | a+b,a+b+c |
3 | - | 减 | 自左向右 | a-b,a-b-c |
4 | = | 赋值 | 自右向左 | a=b |
不同的运算符之间也有优先级,优先级数字越小,优先级越高,乘除(取余)比加减优先级高,单目加减比乘除高。(单目加减其实就是正负号),跟数学上的优先级是一样的。
单目运算法的算子一定出现在运算符右边,所以单目运算法是从右向左结合,双目运算法有两个算子,所以从左向右结合。
同优先级的运算符并列时,一般从左往右进行结合。单目+-和赋值=,自右往左结合。
赋值优先级比所有的四则运算都要低,所以=右边先计算出结果,再进行赋值给左边。赋值优先级很低。
运算符都有结果,赋值也是一个运算符,而不是一个特殊的语句。
赋值A=6本身这个式子有意义,A=6这步运算根据成功与否,成功则返回1。所以A=B=6 → A=(B=6),A的值是B=6这个式子赋值是否成功,A=0或者A=1。
· 不要做嵌入式赋值,不利于阅读,也不利于赋值。
int a=6; int b; int c =1+(b=a); //嵌入式赋值
· 也不要写不好阅读的表达式,计算式。
result=a=b=3+c; //b=3+c,a=(b=3+c),a的值是b赋值是否成功,同理result的结果是a是否赋值成功 result=2; result=(result=result*2)*6*(result=3+result); //这个式子很难判断,result在计算中有没有变过。很难阅读
交换两个变量
int a=6; int b=8; a=b; b=a; //这样交换不了a,b的值,a=8,b=8;
思考一下,交换两个数的值,也就是交换两个杯子里面的水,所以需要第三个杯子c作为临时中介。
int a=6; int b=8; int c; //作为临时中介 c=a; //在a被赋值之前,提前保存a中的值。 a=b; b=c;
思考一下,还有没有其他方式?异或!
编程,你光学习C语言中一些语法,规则是不够的,你还要学习别人是怎么做的,别人是怎么说的?跟学外语一样,要多读多看多写,才能学好。
复合赋值
机器语言中的五则运算符【+-*/%】都是可以跟赋值号【=】结合的,所以C作为一种底层语言也要实现的。
a+=b; // 等于a=a+b; a-=b; // a=a-b; a*=b; // a=a*b; a/=b; // a=a/b; a%=b; //a=a%b;
递增递减运算符,起源早期及其的INC,DEC键。
++,--,有前缀形式,也有后缀形式,前缀形式和后缀形式的表达式含义不同。前缀形式代表先执行加减运算,完成自增或者自减,然后再执行。后缀形式,先不改变变量的值,先执行,执行结束了,再改变变量的值,后手。
int acc=10; printf("a++=%d\n",a++); //10,输出a=10后,再给a+1,a=11 printf("++a=%d\n",++a); //12,先给a+1,a=12,然后在输出a的值。先手 printf("a--=%d\n",a--); //12,输出a=12后,再给a-1,a=11 printf(“--a=%d\n”,--a); //10,先给a-1,a=10完成运算,然后输出a的值,先手
表达式 | 运算 | 表达式的值 |
count++ | 给count+1 | count本身,未自增之前 |
++count | 先给count+1 | count+1,count自增之后的值 |
count-- | 给count-1 | count本身,未自减之前 |
--count | 先给count-1 | count-1,count自减之后的值 |
复合赋值,递增递减运算符都是一种缩写形式,早期用来提高速度,降低内存用的,现在还有没有必要继续用?
现在推荐是还是单独使用,但是不推荐放入到组合表达式中,不利于阅读。
另外,自增自减,组合表达式现在很多编译器,就算是你写的是那种最长的类型,都是可以帮你优化成最简最快速的形式,如果是开发,不是急速开发的话,似乎对这方面要求也不是很高。
再另外,审核说现在有些CPU都不支持这种复合赋值,自增自减命令,那么说,现在随着算力的增高这种自增自减,还有必要吗?
有必要,为了写出更好的程序出来。但是更好的程序既要有好的运行速度,还要有很好的阅读性。
代码简洁高效之道。
++i++-->? i++++-->? a=b+=c++-d--e/-f? //可读性太差了。
这么看老卢当时确实不怎么擅长讲课。
浙大PAT平台,PAT等OJ在线评判平台,给的都是很死板的格式,所以为了通过,一定要把格式用对了。
闲谈:for循环跟While循环一样,刚开始都要判断循环条件的。
满足循环条件,才能启动for循环,不是do-while。
int n=10,i,length=0;; int a[10001]={0}; scanf("%d",&n); for(i=0; n>length; n--){ printf("n=%d\n",n); }
标签:count,优先级,int,浙大,C语言,运算符,--,翁恺,赋值 From: https://www.cnblogs.com/Azzero/p/17839257.html