1. javascript的++与 cpp 的++
今天学习javascript的时候,遇到了一个很有趣的现象,和c++相同的代码,得到的却是截然不同的结果:
- cpp里
int main{
int a = 0;
a = a++
cout<< a <<endl;
return 0;
}
结果为1
- javascript里
<script>
var a =0;
a = a++;
console.log(a);
</script>
结果为0
。
这是为什么呢?想了一下,原因应该这样的:
cpp的解释:
cpp的代码:
输出结果为1
的原因,看下面这个就能明白了
int main{
int a = 0;
cout << &a << endl; //00BCFDDC
a = a++;
cout << &a << endl; //00BCFDDC
return 0;
}
c++里每个变量都有自己的地址,所以像 a = a
这种表达式是没有意义的,不存在高级语言如python, javascript 这种关于变量
的深拷贝、浅拷贝之分 (c++是深拷贝、浅拷贝是针对struct
和class
的拷贝构造函数而言的,且c++默认浅拷贝成员变量)。
因此,这里a = a++
其实等价于a++
,当然了,也等价于a = ++a
。
但是如果换成:
int main{
int a = 0;
b = a++
cout<< b <<endl;
return 0;
}
那么此时输出的就是0
,因为b 接受的 赋值是a 自增前 的值0
,b被赋值后a才自增,这符合 后缀自增运算符 的逻辑,那么输出b,肯定是0啦。
javascript
javascript 是动态类型语言,变量的地址是变化的,因此逻辑变成了:a的值先返回给a(此时a为0),然后a自增,但此时a的地址应该已经变过了,所以a++自然也就不生效了。理解起来就是: 后缀自增运算符在赋值语句里不影响赋值。
<script>
var a =0;
a = a++;
console.log(a);
</script>