-
2016-12-14 20:45:48
git 放弃本地修改 强制更新
git fetch --all git reset --hard origin/master
git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEAD指向刚刚下载的最新的版本
更多相关内容 -
一看就懂的i++和++i详解
2020-05-09 22:10:35我相信很多朋友可能之前已经百度过i++和++i的相关文章了,也做过不少的练习,觉得自己已经深刻掌握了它们之间的原理了,真的是这样的吗?来试试计算一下我下面提供的几道练习,你就会发现你又不会了!前言
转载请说明出处,本文来自Android菜鸟:https://blog.csdn.net/android_cai_niao/article/details/106027313 QQ:2717521606
我相信很多朋友可能之前已经百度过i++和++i的相关文章了,也做过不少的练习,觉得自己已经深刻掌握了它们之间的原理了,真的是这样的吗?来试试计算一下我下面提供的几道练习,你就会发现你又不会了!
示例代码
请先自己心算一下答案,然后找个本子记下来,然后再跟我后面的答案对比,看你能做对几道题,能做对两题以上的我喊你大哥!!
示例1
int i = 0; i = i++; System.out.println("i = " + i);
示例2
int a = 2; int b = (3 * a++) + a; System.out.println(b);
示例3
int a = 2; int b = a + (3 * a++); System.out.println(b);
示例4
int i = 1; int j = 1; int k = i++ + ++i + ++j + j++; System.out.println(k);
示例5
int a = 0; int b = 0; a = a++; b = a++; System.out.println("a = " + a + ", b = " + b);
示例答案
示例1:0
示例2:9
示例3:8
示例4:8
示例5:a = 1, b = 0i++ 和 ++i原理
i++ 即后加加,原理是:先自增,然后返回自增之前的值
++i 即前加加,原理是:先自增,然后返回自增之后的值
重点:这是一般人所不知道的,记住:不论是前++还是后++,都有个共同点是先自增。
对于++i 就不说了,大多数人都懂,而对于 i++ 的原理,我用代码模拟其原理,如下:int temp = i; i = i + 1; return temp;
这3句代码就是上面所说的那样:i++是先自增,然后才返回自增之前的值。
i++字节码分析
有很多的人写的文章上都是说i++是先返回i的值,然后再自增,这是错误,是先自增,然后再返回自增之前的值,你可能会问,这有区别吗?答:有的。只要这个没理解对,则你在计算i++的相关问题时就有可能算错。
有的人可能又会问了,我凭什么相信你,你有什么证据证明i++是先自增,然后再返回自增之前的值吗?我还真去找过证据,我们把class的字节码搞出来,分析一下就知道了,证明如下:
public class Test { void fun() { int i = 0; i = i++; } }
如上,我们写了一个超级简单的Test类。在cmd中输入这个命令(javap -c Test.class)以查看其生成的字节码,截图如下:
我们关注fun()方法这一段就可以了,如下:
这就是fun()函数对应的字节码了,我们一行一行的来分析,首先我们要说两个概念,一个是变量,一个是操作栈,fun()方法中有两个变量,哎,不是只有一个变量i吗?怎么会有两个?要了解这个你需要去学习字节码的相关知识,这里我们不深究,我画图如下:
如上图,变量有两个,在位置0的变量是什么我们不要管,系统自动分配的,你要知道的是位置1的变量其实就是我们定义的变量i就行了,接下来,我们来一行行分析fun()方法对应的字节码:
“ iconst_0 ”: i代表int类型,const代表常量,0就代表整数0,整句话的意思就是把int类型的常量0放入操作栈的栈顶中,图解如下:
“ istore_1 ”: i代表int类型,store代表存储,1代表位置为1的变量,整句话的意思就是把操作栈中栈顶的值拿走,保存到位置为1的变量上,图解如下:
“ iload_1 ”: i代表int类型,load代表加载变量的值,1代表位置为1的变量,整句话的意思就是把位置为1的变量的值加载到操作栈的栈顶中,图解如下:
“ iinc 1, 1 ” : i代表int类型,inc(increment)代表增加,这里还有两个1,前面的1代表对位置为1的变量,第2个1代表增加1,因为有i += 3这种自增操作,这种情况的话第2个数字会是3,即自增3(iinc 1, 3)。“iinc 1, 1” 整句话的意思就是把位置为1的变量的值增加1,图解如下:
注:自增操作不会改变操作栈中的值,所以变量i的值自增后变成了1,而操作栈中的值还是0。“ istore_1 ”: i代表int类型,store代表存储,1代表位置1的变量,整句话的意思就是:把栈顶中的值拿走,保存到位置为1的变量中,图解如下:
所以,这几行字节码合起来看,i++不就是先自增,然后才返回自增之前的值嘛!!所以大家千万别搞错顺序了。 用代码理解的话,就相当于下面的代码:int temp = i; i = i + 1; return temp;
最后再把++i的字节码图也贴一下,大家可以根据我上面讲解的知识分析一下,就会知道++i和i++的区别了:
void fun() { int i = 0; i = ++i; }
表达式原则
表达式有一个原则:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
来看一下 if 语句的其中一种结构定义:
if (条件表达式) 语句;
用这个结构写个代码,如下:
boolean b = true; int i = 0; if(b) i++;
按照上面 if 语句的结构定义,if括号中是一个表达式,但是上面代码写了一个变量b进去,这是一个变量啊,怎么也能当成一个表达式么?没错,一个变量也是表达式。
记住这个重点:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
讲到这里,估计有人会对这个运算顺序和乘法这些搞混了,示例如下:
int a = 0; int b = a + a * 2;
如上代码,按着我的说法,一个变量也是一个表达式,“b = a + a * 2”这里a出现了两次,就是有两个a表达式,从左到右算的话先算a + a,这肯定不对啊,这不是我的意思哈,乘除法的优先级还是不能乱的,那应该先算a * 2吗?也不对,应该是这样的:因为有乘法,所以a * 2优先组成表达式,而不是a + a组成表达式,也就是说总体上可以分为两个表达式:“a” 表达式 和 “a * 2” 表达式,这两个表达式相加肯定从左到右计算嘛,先算完a表达式的结果,再算a * 2表达式的结果。你可能会想先算a和先算a * 2有区别吗?答案是:有的,看完下面 的“示例3详解” 你就清楚了。
示例答案详解
示例1详解
int i = 0; i = i++; System.out.println("i = " + i); // 结果:0
先看i++,根据原理“先自增,然后返回自增之前的值”,i 自增后,i = 1,但是接着返回自增之前的值0,此时表达式变成 i = 0,0没有赋值给 i 时 i 的值是1,但是当把0赋值给 i 时,i 的值就又变成0了。因此 i = i++ 这句代码是做无用功,因为 i 的值最终还是和原来一样。
示例2详解
int a = 2; int b = (3 * a++) + a; System.out.println(b); // 结果:9
int b = (3 * a++) + a;a++后,a = 3,并返回自增之前的值2,所以此时表达式为:
int b = (3 * 2) + a;此时a的值已经是3了,表达式又变为:
int b = (3 * 2) + 3; 所以b = 9
示例3详解
int a = 2; int b = a + (3 * a++); System.out.println(b); // 结果:8
这题和示例2几乎一样啊,只是换了一下顺序而已,为什么结果就不一样了呢?这就需要用到“表达式原则 了”:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
int b = a + (3 * a++);按一般人的想法是先算 3 * a++,a 先自增 a=3,然后返回自增之前的值2,所以此时表达式变为:
int b = a + (3 * 2); 此时a的值为3了,表达式又变为:
int b = 3 + (3 * 2);结果 b = 9
我们说一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的,这个理论你可能不能深刻体会,但是如果我把代码稍微改一下你就能理解了,如下:
int b = (a * 1) + (3 * a++) 这个代码和 int b = a + (3 * a++) 是一样的,没有区别,但是看(a *1)你就很容易的知道要先算a * 1这个表达式,表达式的结果为2。
所以,虽然 int b = a + (3 * a++) 中前面的a只是一个变量,但他也是一个表达式,a这个表达式和(3 * a++)这个表达式进行相加,多个表达式的运算都是从左到右进行的,所以先算a这个表达式,a表达式计算结果为2,所以表达式变成:
int b = 2 + (3 * a++) 然后是a自增并返回自增之前的值2,所以表达式又变为:
int b = 2 + (3 * 2);所以结果为8。此时a的值为3
示例4详解
int i = 1; int j = 1; int k = i++ + ++i + ++j + j++; System.out.println(k); // 结果:8
有了前面3条示例的详解,相信这一条大家就能自己解答了,可以先自己解答一下,看结果是不是8,不是的话,再来看我下面的讲解:
表达式原则说多个表达式的加减法运算都是从左到右进行的,这里的表达式有:i++、++i、++j、j++,都是加法,那我们就从左到右计算这4个表达式就OK了,如下:
1、先算i++,i++之后i的值为2,并返回++之前的值1,所以整个表达式可以变为:
1 + ++i + ++j + j++; // 此时的i值为2
2、再计算++i,++i之后i的值为3,并返回3,所以整个表达式可以变为:
1 + 3 + ++j + j++; // 此时i的值为3
3、再计算++j,++j之后j的值为2,并返回2,所以整个表达式可以变为:
1 + 3 + 2 + j++; // 此时j的值为2
4、再计算j++,j++之后 j的值为3,并返回2,所以整个表达式可以变为:
1 + 3 + 2 +2; // 结果为8,此时j的值为3
示例5详解
int a = 0; int b = 0; a = a++; b = a++; System.out.println("a = " + a + ", b = " + b); // a = 1, b = 0
到了第5题,好像已经没有难度了,大家应该都能解出来了,但是为了文章的完整性,我还是分解一下,大家应该自己先算一次,算不对再来看我的分解:
a = a++; a++之后a的值为1,并返回0,所以a的值由1又变回了0
b = a++; a++之后a的值为1,并返回0,0赋值给b,所以b为0,而a还是1哦!!总结
- i++ 即后加加,原理是:先自增,然后返回自增之前的值
- ++i 即前加加,原理是:先自增,然后返回自增之后的值
- 一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
- 真实开发中,我们不会写这些复杂的i++代码,但是为什么还要掌握这些细节呢?答:笔试,万一笔试的时候遇到这样的题目呢?回答对了就可以加分了,因为这种题很多人是答不出来的,而你回答出来了,那可是很加分的哦!
-
如何理解int i=1;i=i++;
2019-06-16 16:24:20如何理解int i=1;i=i++; 1、引入两个概念:局部变量表和操作数栈 栈帧(Stack Frame): 是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。...如何理解int i=1;i=i++;
1、引入两个概念:局部变量表和操作数栈
栈帧(Stack Frame):
是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。第一个方法从调用开始到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息。在编译代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈 都已经完全确定了,并且写入到了方法表的Code属性中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体虚拟机的实 现
java局部变量表:
是栈帧重要组中部分之一。他主要保存函数的参数以及局部的变量信息。局部变量表中的变量作用域是当前调用的函数。函数调用结束后,随着函数栈帧的销毁。局部变量表也会随之销毁,释放空间。
操作数栈:
与局部变量表一样,均以字长为单位的数组。不过局部变量表用的是索引,操作数栈是弹栈/压栈来访问。操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区。
存储的数据与局部变量表一致含int、long、float、double、reference、returnType,操作数栈中byte、short、char压栈前(bipush)会被转为int。
数据运算的地方,大多数指令都在操作数栈弹栈运算,然后结果压栈。
java虚拟机栈是方法调用和执行的空间,每个方法会封装成一个栈帧压入占中。其中里面的操作数栈用于进行运算,当前线程只有当前执行的方法才会在操作数栈中调用指令(可见java虚拟机栈的指令主要取于操作数栈)。
2、对=赋值运算符的理解
操作数栈弹栈赋值给局部变量表的变量
3、理解int i=1;i=i++;
对于int i=1;
局部变量表生成标识为i的变量,操作数栈将1压栈,=右边运算已结束,操作数栈将1弹栈,通过=赋值给局部变量表的i变量。
对于i=i++;
i还是局部变量存在的,
i++意思是操作数栈将局部变量表i变量的值压栈,操作数栈栈顶元素是1;之后对局部变量表i变量的值自增变为2;(=右边运算已结束)最后操作数栈将栈顶元素1弹栈,通过=赋值给局部变量表的i变量,此时局部变量表变量i的值为1
综上int i=1;i=i++;此时i=1
补充:
int i=1;i=++i;
对于i=++i;
是先对局部变量表中i变量进行自增,局部变量表中i变量的值为2;操作数栈将局部变量表i变量的值(2)压栈,操作数栈栈顶元素是2;(=右边运算已结束)最后操作数栈将栈顶元素2弹栈,通过=赋值给局部变量表的i变量,此时局部变量表变量i的值为2
-
详解i++和++i,通俗易懂
2021-01-19 19:16:31之前已经百度过i++和++i的相关文章了,感觉这篇写的最好理解,和大家分享一下! 示例代码 请先自己心算一下答案,然后找个本子记下来,然后再跟我后面的答案对比,看你能做对几道题,能做对两题以上的我喊你大哥!...之前已经百度过i++和++i的相关文章了,感觉这篇写的最好理解,和大家分享一下!
示例代码
请先自己心算一下答案,然后找个本子记下来,然后再跟我后面的答案对比,看你能做对几道题,能做对两题以上的我喊你大哥!!
示例1
int i = 0; i = i++; System.out.println("i = " + i);
示例2
int a = 2; int b = (3 * a++) + a; System.out.println(b);
示例3
int a = 2; int b = a + (3 * a++); System.out.println(b);
示例4
int i = 1; int j = 1; int k = i++ + ++i + ++j + j++; System.out.println(k);
示例5
int a = 0; int b = 0; a = a++; b = a++; System.out.println("a = " + a + ", b = " + b);
示例答案
示例1:0
示例2:9
示例3:8
示例4:8
示例5:a = 1, b = 0i++ 和 ++i原理
i++ 即后加加,原理是:先自增,然后返回自增之前的值
++i 即前加加,原理是:先自增,然后返回自增之后的值
重点:这是一般人所不知道的,记住:不论是前++还是后++,都有个共同点是先自增。
对于++i 就不说了,大多数人都懂,而对于 i++ 的原理,我用代码模拟其原理,如下:int temp = i; i = i + 1; return temp;
这3句代码就是上面所说的那样:i++是先自增,然后才返回自增之前的值。
i++字节码分析
有很多的人写的文章上都是说i++是先返回i的值,然后再自增,这是错误,是先自增,然后再返回自增之前的值,你可能会问,这有区别吗?答案:有的。只要这个没理解对,则你在计算i++的相关问题时就有可能算错。
有的人可能又会问了,我凭什么相信你,你有什么证据证明i++是先自增,然后再返回自增之前的值吗?我还真去找过证据,我们把class的字节码搞出来,分析一下就知道了,证明如下:
public class Test { void fun() { int i = 0; i = i++; } }
如上,我们写了一个超级简单的Test类。在cmd中输入这个命令(javap -c Test.class)以查看其生成的字节码,截图如下:
我们关注fun()方法这一段就可以了,如下:
这就是fun()函数对应的字节码了,我们一行一行的来分析,首先我们要说两个概念,一个是变量,一个是操作栈,fun()方法中有两个变量,哎,不是只有一个变量i吗?怎么会有两个?要了解这个你需要去学习字节码的相关知识,这里我们不深究,我画图如下:
如上图,变量有两个,在位置0的变量是什么我们不要管,系统自动分配的,你要知道的是位置1的变量其实就是我们定义的变量i就行了,接下来,我们来一行行分析fun()方法对应的字节码:
“ iconst_0 ” i代表int类型,const代表常量,0就代表整数0,整句话的意思就是把int类型的常量0放入操作栈的栈顶中,图解如下:
“ istore_1 ” i代表int类型,store代表存储,1代表位置为1的变量,整句话的意思就是把操作栈中栈顶的值拿走,保存到位置为1的变量上,图解如下:
“ iload_1 ” i代表int类型,load代表加载变量的值,1代表位置为1的变量,整句话的意思就是把位置为1的变量的值加载到操作栈的栈顶中,图解如下:
“ iinc 1, 1 ” i代表int类型,inc(increment)代表增加,这里还有两个1,前面的1代表对位置为1的变量,第2个1代表增加1,因为有i += 3这种自增操作,这种情况的话第2个数字会是3,即自增3(iinc 1, 3)。“iinc 1, 1” 整句话的意思就是把位置为1的变量的值增加1,图解如下:
注:自增操作不会改变操作栈中的值,所以变量i的值自增后变成了1,而操作栈中的值还是0。“ istore_1 ” i代表int类型,store代表存储,1代表位置1的变量,整句话的意思就是:把栈顶中的值拿走,保存到位置为1的变量中,图解如下:
所以,这几行字节码合起来看,i++不就是先自增,然后才返回自增之前的值嘛!!所以大家千万别搞错顺序了。 用代码理解的话,就相当于下面的代码:int temp = i; i = i + 1; return temp;
最后再把++i的字节码图也贴一下,大家可以根据我上面讲解的知识分析一下,就会知道++i和i++的区别了:
void fun() { int i = 0; i = ++i; }
表达式原则
表达式有一个原则:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
来看一下 if 语句的其中一种结构定义:
if (条件表达式) 语句;
用这个结构写个代码,如下:
boolean b = true; int i = 0; if(b) i++;
按照上面 if 语句的结构定义,if括号中是一个表达式,但是上面代码写了一个变量b进去,这是一个变量啊,怎么也能当成一个表达式么?没错,一个变量也是表达式。
记住这个重点:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
讲到这里,估计有人会对这个运算顺序和乘法这些搞混了,示例如下:
int a = 0; int b = a + a * 2;
如上代码,按着我的说法,一个变量也是一个表达式,“b = a + a * 2”这里a出现了两次,就是有两个a表达式,从左到右算的话先算a + a,这肯定不对啊,这不是我的意思哈,乘除法的优先级还是不能乱的,那应该先算a * 2吗?也不对,应该是这样的:因为有乘法,所以a * 2优先组成表达式,而不是a + a组成表达式,也就是说总体上可以分为两个表达式:“a” 表达式 和 “a * 2” 表达式,这两个表达式相加肯定从左到右计算嘛,先算完a表达式的结果,再算a * 2表达式的结果。你可能会想先算a和先算a * 2有区别吗?答案是:有的,看完下面 的“示例3详解” 你就清楚了。
示例答案详解
示例1详解
int i = 0; i = i++; System.out.println("i = " + i); // 结果:0
先看i++,根据原理“先自增,然后返回自增之前的值”,i 自增后,i = 1,但是接着返回自增之前的值0,此时表达式变成 i = 0,0没有赋值给 i 时 i 的值是1,但是当把0赋值给 i 时,i 的值就又变成0了。因此 i = i++ 这句代码是做无用功,因为 i 的值最终还是和原来一样。
示例2详解
int a = 2; int b = (3 * a++) + a; System.out.println(b); // 结果:9
int b = (3 * a++) + a;a++后,a = 3,并返回自增之前的值2,所以此时表达式为:
int b = (3 * 2) + a;此时a的值已经是3了,表达式又变为:
int b = (3 * 2) + 3; 所以b = 9
示例3详解
int a = 2; int b = a + (3 * a++); System.out.println(b); // 结果:8
这题和示例2几乎一样啊,只是换了一下顺序而已,为什么结果就不一样了呢?这就需要用到“表达式原则 了”:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
int b = a + (3 * a++);按一般人的想法是先算 3 * a++,a 先自增 a=3,然后返回自增之前的值2,所以此时表达式变为:
int b = a + (3 * 2); 此时a的值为3了,表达式又变为:
int b = 3 + (3 * 2);结果 b = 9
我们说一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的,这个理论你可能不能深刻体会,但是如果我把代码稍微改一下你就能理解了,如下:
int b = (a * 1) + (3 * a++) 这个代码和 int b = a + (3 * a++) 是一样的,没有区别,但是看(a *1)你就很容易的知道要先算a * 1这个表达式,表达式的结果为2。
所以,虽然 int b = a + (3 * a++) 中前面的a只是一个变量,但他也是一个表达式,a这个表达式和(3 * a++)这个表达式进行相加,多个表达式的运算都是从左到右进行的,所以先算a这个表达式,a表达式计算结果为2,所以表达式变成:
int b = 2 + (3 * a++) 然后是a自增并返回自增之前的值2,所以表达式又变为:
int b = 2 + (3 * 2);所以结果为8。此时a的值为3
示例4详解
int i = 1; int j = 1; int k = i++ + ++i + ++j + j++; System.out.println(k); // 结果:8
有了前面3条示例的详解,相信这一条大家就能自己解答了,可以先自己解答一下,看结果是不是8,不是的话,再来看我下面的讲解:
表达式原则说多个表达式的加减法运算都是从左到右进行的,这里的表达式有:i++、++i、++j、j++,都是加法,那我们就从左到右计算这4个表达式就OK了,如下:
1、先算i++,i++之后i的值为2,并返回++之前的值1,所以整个表达式可以变为:
1 + ++i + ++j + j++; // 此时的i值为2
2、再计算++i,++i之后i的值为3,并返回3,所以整个表达式可以变为:
1 + 3 + ++j + j++; // 此时i的值为3
3、再计算++j,++j之后j的值为2,并返回2,所以整个表达式可以变为:
1 + 3 + 2 + j++; // 此时j的值为2
4、再计算j++,j++之后 j的值为3,并返回2,所以整个表达式可以变为:
1 + 3 + 2 +2; // 结果为8,此时j的值为3
示例5详解
int a = 0; int b = 0; a = a++; b = a++; System.out.println("a = " + a + ", b = " + b); // a = 1, b = 0
到了第5题,好像已经没有难度了,大家应该都能解出来了,但是为了文章的完整性,我还是分解一下,大家应该自己先算一次,算不对再来看我的分解:
a = a++; a++之后a的值为1,并返回0,所以a的值由1又变回了0
b = a++; a++之后a的值为1,并返回0,0赋值给b,所以b为0,而a还是1哦!!总结
- i++ 即后加加,原理是:先自增,然后返回自增之前的值
- ++i 即前加加,原理是:先自增,然后返回自增之后的值
- 一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
- 真实开发中,我们不会写这些复杂的i++代码,但是为什么还要掌握这些细节呢?答:笔试,万一笔试的时候遇到这样的题目呢?回答对了就可以加分了,因为这种题很多人是答不出来的,而你回答出来了,那可是很加分的哦!
转载自https://blog.csdn.net/android_cai_niao/article/details/106027313
-
STM32 HAL库 硬件I2C 从机主机防BUG程序
2020-05-24 02:23:31前言 最近死磕了5天的STM32F1硬件I2C从机的程序,天天早上8点到凌晨,几乎全程心流状态。终于在结合各方资料即自己的...要问他的兼容性有多强,连I2C bug都能做到一样,哈哈。我当初用GD想着硬件I2C应该能舒服用了,万 -
i 标签设置背景图片作 icon的问题
2019-07-28 21:25:29写了一个 i 标签给它设置了宽高和背景图片,但是界面不显示,且宽高依然是0 .icon-name { background: url("../../img/username.png"); width: 40px; height: 35px; } **1、因为 i 标签是行内标签,它不可以... -
Python学习之 i += 3 与 i = i +3
2018-09-06 18:13:07详解Python中表达式i += x与i = i + x是否等价,python表达式 最近看到一个题目,看似很简单,其实里面有很深的意义,题目是Python 表达式 i += x 与 i = i + x 等价吗?如果你的回答是yes,那么恭喜你正确了50%,... -
[总线]I2C通信
2018-11-14 10:14:56I2C总线 SCL:时钟 SDA:数据 接线 主设备和从设备 SDA脚——SDA脚 SCL脚——SCL脚 传输数据 I2C有设备地址 开始:SCL为高电平时,SDA由高电平向低电平跳变(下降沿) 结束:SCL为高电平时,SDA由低... -
串口通信————UART、I2C、SPI详解(总结篇)
2022-01-04 09:55:57UART、I2C、SPI 串口通信工作原理、传输步骤详解,串行与并行,全双工与半双工,异步方式与同步方式 -
在循环语句中,for(i=0;i;i++)和for(i=0;i;++i)有什么区别?
2016-11-03 13:03:00我同学有简单地告诉我,i++的话要先copy出一个i然后赋值,用原来的i继续其他运算,最后再把copy出来的i做个increment,然后返还给原来的i。 而++i直接在原来的i上做increment。 结论:当n很大的时候,++i速度比i++... -
SMBus与I2C的区别
2017-07-24 15:08:41【转】SMBus与I2C的区别 SMbus 最早是由 Intel 公司提出来的。现在由 SBS 管理维护这一个规格。 此规格是用 Philips 的 I2C 简化而来。 SMbus 是由两条信号线组成。用于在系统上较慢速的设备及电源管理设备之间的... -
[lambda x: x*i for i in range(4)] 详细解析+LEGB规则 闭包原理
2018-10-31 14:40:44一、问题描述 fun = [lambda x: x*i for i in range(4)] for item in fun: print(item(1)) 上述式子的输出结果: 预计结果为:0, 2, 4, 6 实际输出为:3, 3, 3, 3 原理:i 在外层作用域 lambd... -
关于printf("%d,%d",++i,i++)与printf("%d,%d",i++,++i)结果差异很大的问题解释
2019-09-05 15:22:16从我们学习C语言开始一直到C++,++i与i++一直是我们每天在使用的,他们一个是前增量,一个是后增量,他们的区别到底有多大? 我们来看看下面的两种操作结果: 当我们执行如下代码时: #include<stdio.h> int ... -
FPDLINK中I2C通信的巧妙设计以及I2C Stretch
2017-01-11 19:43:57TI的FPDLINK芯片充分利用了这个特性,他并不是把接收到的i2c波形进行简单的转发(即保持和发送端相同的波特率),而是将收到的数据重新再按照FPDLINK芯片上设置的波特率重新发送。因此在分析FPDLINK Slave端i2c ... -
STM32F405 硬件I2C(SMBus)做从机与电脑通信,使用I2C中断收发
2018-07-09 15:17:16首先I2C和SMBus是兼容的,亲测把初始化换成SMBus或者I2C都是可以通信的。... 反正他既然说了就搞呗,结果发现网上关于I2C用从机中断的资料巨少,就想着把代码po上来共享一下。#include "II... -
单链表的删除第i个元素
2019-08-28 18:11:13a2的节点q,要实现q的删除,就是让他的前继节点p绕过a2直接指向后继节点a3。 p->next=p->next->next; 单链表第i个数据删除结点的算法思路: 1.声明结点p指向链表第一个结点,初始化j=1; 2.当j<i时,就... -
esp32 在arduino1.8下的I2C引脚
2018-08-07 16:28:13写的很叙事 ...恐惧:恐惧是给C++的,我这几天正好在网上看到别人说,C++语法可以特别特别恶心,常量特别特别难定位。我就在想有多难,有多恶心,CTRL+f很快就定位到了。然后这几天头头在捣鼓传感器,我... -
I2C SDA SCL被拉低问题分析
2020-08-11 12:18:59描述一下I2C最重要的几个特性,为了后面描述问题和解决方案作一些铺垫。 I2C是由两根线(时钟SCL + 数据SDA)组成的多主多从串行同步通信总线。 规范要求接入I2C的器件,SCL时钟和SDA数据线都必须是双向开漏结构的... -
C语言 表白代码(I love you!)
2019-10-11 18:00:18i++) printf("%d+%d=%c%c\t",i,i+2,i,i+2); printf("\n"); return 0; } #include int main(void) { char s[]="啊";//汉字在C/C++中是用2个字节表示的,而对应的ASCII码则是两个负数。 char m[3]; printf("%d %d\n... -
i=i++的问题
2017-08-06 22:04:52public class Test { public static void main(String[] args) { int i = 1; i = i++; System.out.println(i);...按照我最初的想法,输出应该是2,因为把i赋值给i相当于没做什么操作,然后对i进行自 -
I/O复用的理解
2018-05-12 00:31:27I/O复用就是单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流.假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接... -
i2c_transfer函数
2015-12-09 15:29:10i2c_transfer函数 i2c_transfer函数 i2c_transfer()函数本身不具备驱动适配器物理硬件完成消息交互的能力,它只是寻找到i2c_adapter对应的i2c_algorithm,并使用i2c_algorithm的master_xfer()函数真正驱动硬件流程... -
【STM32-I2C学习总结】STM32:硬件-IIC详解 , 固件库编程 , 手把手教你实现IIC
2021-02-06 14:19:08一 、I2C物理层 I2C 通讯设备之间的常用连接方式见图: 有以下特点:(参考数据手册:上拉电阻一般4.7k~10k ,一般4.7k) (1)由两条总线控制:一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示... -
RISC-V RV32I 基本6种指令集
2020-04-14 12:49:01RISC-V 的RV32I是最基本的指令集,包括6种。 其中最基本的是R I S U。 R type -
STM32F030 硬件I2C驱动 AT24C16
2016-10-21 20:17:33由于F0完全重写了I2C,所以以往的代码并不能直接使用,修改事件、接口上会浪费很多时间,特别是对于使用F0系列进行入门的新手。 在此十分感谢 畅学电子网 的对于AT24C16的资料,特别是AT24C16地址的解释。调试过程... -
KeyClone v1.9i中文免费版
2011-07-05 21:03:18KeyClone v1.9i中文版(只有广告!没毒才是硬道理) 这个Keyclone的功能是比AutoHotKey要来的强,而且更简单。所以我还是要向大家推荐,并且给大家一些简单的教程,好让大家快速上手。 首先下载破解版本免安装的,... -
超硬核!学霸把操作系统经典算法给敲完了!要知行合一
2021-03-24 12:37:56//功能:获取第i个结点元素 Status GetElemt_L(LinkList L,int i,ElemType *e); //功能:链表根据优先级插入元素 Status ListInsert_L(LinkList L,ElemType e); //功能:链表删除头结点 Status ListDelete_L... -
漫画:以后有面试官问你快速排序,你就干脆把我这篇熬夜写的文章扔给他!
2020-03-21 12:14:372、给俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。 作者简洁 作者:大家好,我是帅地,从大学、自学一路走来,深知算法,计算机基础知识的重要性,所以申请了一个微星公众号『帅地玩编程』,专业... -
空间统计:Moran's I(莫兰指数)
2018-03-10 16:22:07前两天聊了空间统计学里面的两个经典概念,今天来说说第一篇文章留下的大坑:Moran’s I。 首先,Moran’s I这个东西,官方叫做:莫兰指数,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰(Patrick ... -
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
2019-09-10 23:27:18),写个猜数字游戏,问他加减乘除等于几。 超越妹妹又不是小孩子,糊弄不过去。 经过一番折腾,终于在半夜12点确定写 迷宫小游戏 了。大概弄清楚其中的几个步骤。 大概是 : 画线—>画迷宫(擦线)—>...