C++基础 (1) 常见的易错问题
1 #include<iostream> 2 using namespace std; 3 int main(void) 4 { 5 /* 6 *True为1,False为0 7 */ 8 int x=2,y,z; 9 x*=(y=z=5);cout<<x<<endl;//结果10 10 z=3; 11 x==(y=z);cout<<x<<endl;//结果10 12 x=(y&z);cout<<x<<endl;//按位与。结果3 13 x=(y&&z);cout<<x<<endl;//与运算。结果1 14 y=4; 15 x=(y|z);cout<<x<<endl;//按位或。结果7 16 x=(y||z);cout<<x<<endl;//或运算。结果1 17 return 0; 18 }
我的理解,第9行,先计算括号内的,将5赋值给z,y,然后x=x*5.
第11行,是一个判断语句==符号并不会改变操作数的值.当为真,这个运算符返回1,否则0或FALSE.此处x值不变.
第12行,&是按位与运算.只有当两位都是1时才为真,即任意一边位为0,则该位按位与后结果为0.如1010&1001他结果等于1000.
同理,按位或|操作符是当两位有一位为1时,按位或的值就为1.如1010|1001结果为1011.
按位异或^操作符是仅当有且只有一位为1时按位异或结果才为1.如1010^1001结果为0011.
~是按位求反,~1001结果是0110.
<<在非输出流(cout)或重载情况下表示按位左移,右边0补齐,>>向右移.如int a=5;
a<<2 //00000101变成了00010100
&&,||,!是逻辑运算,或,与非,他们的结果只有TRUE或FALSE.
#include <iostream> using namespace std; void main() { int a=4,b=6,c=7; if(a==4||b++){ cout<<"a="<<a<<" b="<<b<<endl;//a=4 b=6 } if(a==4&&b++){ cout<<"a="<<a<<" b="<<b<<endl;//a=4 b=7 } if(a==b&&c++){ cout<<"未跳过c="<<c<<endl; } else cout<<"跳过 c="<<c<<endl; //跳过 c=7 }
逻辑或运算||是当两边表达式有一个为真该运算结果就为真,即当||左边表达式为真时不会计算右边表达式.&&操作符,当左边表达式为假时就不计算右边表达式,只有当左边为真时才会计算右边表达式.
如下代码:
1 using namespace std; 2 int TEMP=3; 3 int main(void) 4 { 5 /* 6 *C++全局变量与局部变量 7 */ 8 int TEMP=10; 9 ::TEMP++; 10 cout<<::TEMP<<endl;//结果为3 11 cout<<TEMP<<endl;//结果为10 12 return 0; 13 }
第2行声明并定义了全局变量TEMP,第8行声明了局部变量TEMP.那么在main函数中,直接使用TEMP指的是局部变量,即TEMP=10,使用全局变量可加全局作用域::
如下代码:
1 #include<iostream> 2 using namespace std; 3 int main(void) 4 { 5 int i=1,j=2; 6 int k=i+++j; 7 cout<<k<<endl;//结果是3 8 9 return 0; 10 }
如下代码:
1 a = 4; cout << a++ << a;
这是CSDN C++板块上置顶的一个,拿到这所的原因是现在的国家计算机二级考试常考这种题,我在两台电脑上用不同编译器得到的结果是不同的,所以记住一个规则:
任何依赖于特定计算顺序、依赖于在顺序点之间实现修改效果的表达式,其结果都没有保证。程序设计中应该贯彻的规则是:如果在任何“完整表达式”(形成一段由顺序点结束的计算)里存在对同一“变量”的多个引用,那么表达式里就不应该出现对这一“变量”的副作用。否则就不能保证得到预期结果
如下代码:
1 #include<iostream> 2 using namespace std; 3 int main(void) 4 { 5 /* 6 x=x+1,x+=1,x++;哪个效率最高,为什么? 7 x=x+1;效率最低,执行过程如下 8 1.读取右边x地址 9 2.x+1 10 3.读取左边x地址 11 4.将右值传给左边 12 x+=1;其次,执行过程如下 13 1.读取右边x地址 14 2.x+1 15 3.将值传给x 16 x++效率最高,执行过程如下 17 1.读取右边的x地址 18 2.x自增1 19 */ 20 return 0; 21 }
其实这个在汇编中很好解释,x=x+1相比x++要多使用几次寄存器,效率自然要低点,不过这种写法也不是特实用,毕竟现代的计算机已经非常快乐,一些特殊项目不算.

浙公网安备 33010602011771号