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++要多使用几次寄存器,效率自然要低点,不过这种写法也不是特实用,毕竟现代的计算机已经非常快乐,一些特殊项目不算.

posted @ 2013-03-03 22:55  鱼在动态晒太阳  阅读(217)  评论(0)    收藏  举报