本人纯小白一枚,只是把最近的学习感悟总结在这里。
(一.)一个字节的最大值(127)和最小值(-128)
关于一个这个问题其实蛮有趣的,要解决这个问题首先不得不说计算机中的原码补码反码,对于一个十进制数,我们直观的可以用笔按进制那样写出来的那是原码,而计算机中的操作实际上都是以补码的方式进行的,对于正数原码补码反码都是一样的倒无所谓,但对于负数把原码按位取反(其中符号位不变)二进制中最高位(即第一个位)0表示正的,1表示负的,得到反码,最后末位+1得到补码。
按照这个规律,一个字节为8个位, 对于正数符号位是0不能变,其最大值是0111 1111,其值为127。
那对于负数,由于最高位只能是1,那我肯定合计着负数能取的最小值就是让它的绝对值尽可能的大些就是1111 1111,这么一算的话我靠,这不是-127吗,哪来的-128?如果我们从答案本身寻找答案来推导,假如不考虑符号位要表示128那就是1000 0000,如果对其整个按位取反为0111 1111,取得补码末位再+1得1000 000,最高位为1肯定表示一个负数,但是如果让最高位参与运算那结果就是-128,如果不让最高位参与运算那就是-0了,其实我觉得这里就暗含了一个问题,就是计算机中的负0和负128重合了,原本从正0开始到正127,一共128个数字,而负数也应该有128个数字,只是这里的负0和负128重合了导致了这个问题。
(二.)类型转换
在编程中,一定的数据类型必须要跟与其对应的关键字匹配才行,虽然编译器上会有提示,但是答笔试的时候就没有提示了哦,我觉得最经典的还是下面这个:
(三.)短路运算符
这里所说的短路运算符其实就是&&和||这两个逻辑运算符,至于为什么叫它两短路运算符,这样更有利于深刻理解它们的执行逻辑,其基本使用方法是这样的:
表达式1&&表达式2,跟汉语中的或一样,只有所有表达式都为true,整个运算结果就为true,只要任意表达是为false,则整个表达式运算结果都为false。
表达式1||表达式2,跟汉语中的与一样,只要任意一个表达式为true,则整个运算结果为true。
这里只并列了两个表达式,其实可以同时并列更多的表达式,而我们为什么要用短路这个词来形容这两个逻辑运算呢,实际上在&&和||的运算过程中,只要其中的第一个表达式已经可以明确表明结果了那后面的表达式就不会再进行判断了,就跟电流短路一样,整个表达式就会只截止到这里,例如:对于&&来说,如果第一个表达式为false,那么运算就不会往后继续了,整个表达式运算结果直接为false,对于||来说,如果第一个表达式为true,那么运算也不会往后继续了,整个表达式运算结果直接为true。
(四.)abc中最大值的优化
这原本是老师布置的一道作业题,输入a,b,c三个数,并输出其中的最大值,这个题本来没什么好说的,但是如果要把这个题写的很极致我觉得对于一个初学者的我来说还是很有意义的,对于初入的小白来说可能大部分会一个劲纠结于a先大于b,然后b和c谁大谁小怎么怎么样又分很多种情况,我最开始还自认为想了个好点的方法(我只写了比较大小的部分),如下:
if(a>b && a>c) {
System.out.println("最大值为"+a);
}else if(b>c && b>a){
System.out.println(“最大值为”+b);
}else if(c>a && c>b){
System.out.println(“最大值为”+c); }
这样的好处是利用上面的短路运算符很直观的不用费脑子纠结到底谁大谁小很自然就写出结果了,但是这只是abc三个数我可以这么写,如果更多呢那岂不要写很多行这种比较了,那也太sb了,所以我觉得还是用max取得比较大的那个值然后继续比较会好一点,像这样:
int max=0;
if(a>b){
max = a;
}else{
max = b;
}
if(max <c){
max = c;
}
System.out.println(max);
这样写其实也比较常规,我觉得也挺一般的那现在开始优化吧,引入三目运算符:
int max = a>b?a:b;
max = max > C?max:c;
这样是不是变短了很多也高大尚了很多,继续优化:
int max = (a>b?a:b) >c ? (a>b?a:b):c;
一行搞定,嘻嘻(#.#)。