刚毕业的小新在阅读同事的代码时,看到一个 ( !! Vmode<<6 ) 的运算,刚开始看到的时候很疑惑,这双重取非不是又回到原来的值了吗?研究了好一会才搞清楚是怎么回事。
第一步我们需要了解:
“!” 运算符含义表示“逻辑非运算”,即为0、1运算,使用形式为“!表达式”,且自右向左运算;
“!” 运算符优先级高于左移运算符“<<” ;
表达式是指由常量、变量、函数,通过运算符连接起来而形成的一个算式,一个常量,一个变量或一个函数都可以看成是一个表达式。
假设我们定义
1 int Vmode = 3;
2 int a[3] = {0};
3 a[0] = Vmode<<6;
4 a[1] = !Vmode<<6;
5 a[2] = !!Vmode<<6;
a[0] = Vmode<<6很容易计算得出等于192;
因为 Vmode = 3 > 0
所以 逻辑非运算“!Vmode” 就相当于 “!1”
那么得到一下结果:
a[1] = !Vmode<<6 = (!1)<<6 = 0<<6 = 0;
a[2] = !!Vmode<<6 = (!(!1))<<6 = (!(0))<<6 = 1<<6 = 64;
本次分享其实是很简单的运算问题,但是像我这样的小新很容易对运算符的含义理解不清或者是容易模糊理解,就比如“!”运算符的含义指的是“逻辑非”运算,一开始我就很自然地按位取反来操作,结果怎么都算不出来,但实际上的结果应该是非0即1 ,这就是逻辑运算的含义。
希望本次分享可以帮助到像我这样对运算符的使用理解不清楚的小伙伴,也希望大家可以借此分享举一反三,同时本文有表达错误的地方,欢迎给予指正!