C++快速入门 (二) 变量和运算符

本文介绍了C++中的变量声明、全局变量的使用,详细讲解了各种运算符,包括+=, -=, *=, /=以及i++和++i的区别。强调了自增/减操作符在混合运算中的风险,指出不同编译器可能产生的不同结果,并提供了VC11和Java中性能比较的观察。" 111543932,8759932,Cisco IPS: 配置告警与日志动作策略,"['运维', '网络安全', '思科', 'ids']

一 变量

(1). 声明一个变量
要声明一个变量非常简单
  • 类型 变量名 = 变量值;
如: int x = 10;

也可以声明时不指定变量值
  • 类型 变量名;
如: int x;  

当编译器编译到这样的未声明初始值的变量时, 有可能会为其进行隐式的初始化 (按类型),而默认的初始化值根据变量声明的位置不同其值也可能不同
当变量声明于函数的作用域外时
  • 字符串类型默认为 空字符串
  • 数字类型默认为 零
当变量声明于函数的作用域内时其 变量初始化值不确定。也就是说有些编译器会为其初始化,有些直接不处理甚至会抛出异常。

显然依赖于编译器来填充初始化值是很危险的。

二 全局变量

(1). 什么是全局变量
全局变量既可以在多个文件中共享的变量。声明全局变量和普通变量的方法一样,区别只是全局变量需要在 最上层作用域声明

(2). 使用全局变量
要使用其他文件中定义的全局变量时,只需以关键字 extern 声明即可 如

classA.cpp
int x = 101;
-----------------
main.cpp
extern   int  te;
int  _tmain( int  argc, _TCHAR* argv[])
{
    cout << te << endl;   // return 101
}

关键字 extern 的作用是告诉编译器 该变量已经其他某个文件中定义,所以编译器不会为对其进行 初始化值等一般变量需要的操作,而将 为该变量找到它 在其他 某个文件中定义的工作是由 链接器 完成的

三 运算

(1). 操作符
声明了变量,就可以使用算术操作符来操作它,如

int x = 10, y = 20;
x = x + ( y - 10 );

其中用于计算的算术操作符叫做运算符,和数学中的运算符一样, C++中的运算符也有优先级的问题,运算符作用及其优先级如下表:
优先级操作符描述例子结合性
1()
[]
->
.
::
++
--
调节优先级的括号操作符
数组下标访问操作符
通过指向对象的指针访问成员的操作符
通过对象本身访问成员的操作符
作用域操作符
后置自增操作符
后置自减操作符
(a + b) / 4;
array[4] = 2;
ptr->age = 34;
obj.age = 34;
Class::age = 2;
for( i = 0; i < 10; i++ ) ...
for( i = 10; i > 0; i-- ) ...
从左到右
2!
~
++
--
-
+
*
&
(type)
sizeof
逻辑取反操作符
按位取反(按位取补) 
前置自增操作符
前置自减操作符
一元取负操作符
一元取正操作符
解引用操作符
取地址操作符
类型转换操作符
返回对象占用的字节数操作符
if( !done ) ...
flags = ~flags;
for( i = 0; i < 10; ++i ) ...
for( i = 10; i > 0; --i ) ...
int i = -1;
int i = +1;
data = *ptr;
address = &obj;
int i = (int) floatNum;
int size = sizeof(floatNum);
从右到左
3->*
.*
在指针上通过指向成员的指针访问成员的操作符
在对象上通过指向成员的指针访问成员的操作符
ptr->*var = 24;
obj.*var = 24;
从左到右
4*
/
%
乘法操作符
除法操作符
取余数操作符
int i = 2 * 4;
float f = 10 / 3;
int rem = 4 % 3;
从左到右
5+
-
加法操作符
减法操作符
int i = 2 + 3;
int i = 5 - 1;
从左到右
6<<
>>
按位左移操作符
按位右移操作符
int flags = 33 << 1;
int flags = 33 >> 1;
从左到右
7<
<=
>
>=
小于比较操作符
小于或等于比较操作符
大于比较操作符
大于或等于比较操作符
if( i < 42 ) ...
if( i <= 42 ) ...
if( i > 42 ) ...
if( i >= 42 ) ...
从左到右
8==
!=
等于比较操作符
不等于比较操作符
if( i == 42 ) ...
if( i != 42 ) ...
从左到右
9&按位与操作符flags = flags & 42;从左到右
10^按位异或操作符flags = flags ^ 42;从左到右
11|按位或操作符flags = flags | 42;从左到右
12&&逻辑与操作符if( conditionA && conditionB ) ...从左到右
13||逻辑或操作符if( conditionA || conditionB ) ...从左到右
14? :三元条件操作符int i = (a > b) ? a : b;从右到左
15=
+=
-=
*=
/=
%=
&=
^=
|=
<<=
>>=
赋值操作符
复合赋值操作符(加法)
复合赋值操作符(减法)
复合赋值操作符(乘法)
复合赋值操作符(除法)
复合赋值操作符(取余)
复合赋值操作符(按位与)
复合赋值操作符(按位异或)
复合赋值操作符(按位或)
复合赋值操作符(按位左移)
复合赋值操作符(按位右移)
int a = b;
a += 3;
b -= 4;
a *= 5;
a /= 2;
a %= 3;
flags &= new_flags;
flags ^= new_flags;
flags |= new_flags;
flags <<= 2;
flags >>= 2;
从右到左
16,逗号操作符for( i = 0, j = 0; i < 10; i++, j++ ) ...从左到右


(2). +=,-=,*=,/=
如 x+=10 其实是 x = x+10 的简写形式,

(3). i++ 和 ++i
i++ 和 ++i 都是为变量 i 自加 1,但其操作方式是不同的
  • i++是先计算再 +1
  • ++i是先 +1 再计算

     int  x = 10, y = 10;
    x = 10 * x++ ;   //  ==  (10 * x) + 1 = 101
    y = 10 * ++y ;   // == 10 * (x+1) = 110


(4). i++ 到底干了什么
拿上边的例子来说
  • x = 10 * x++ ;
由于 i++的优先级高于 * 号,所以可以写成
  • x = 10 * ( x++ );
既然先计算 "x+1" 为什么 x 最后等于 101 ,而不是 110 呢, 可以这样理解: 碰到后置自增符号x++ 时,编译器会先将 x 存储在一个临时变量中,并用该 临时变量 进行其他计算,最后再执行 +1操作,

需要说明几点:
  • 自增/减 操作符 一般只单独使用, 而不要用于混合运算中。
  • 不同的编译器,对自增/减的处理会有所不同,所以结果可能也不同,如C++ 和 Java
  • 至少在 VC11中, i++ 性能 ++i 基本一致(看了下汇编代码感觉差不多), 而在 Java中 ++i 性能优于 i++,
  • --i 性能优于 ++i 

最后思考下 ,VC11环境下 x,y 值是多少(再次强调,项目中千万别这么写)

     int  x=10, y=10;
    x = (x++)+(x++);
    y = (++y)+(++y);










-

<原创文章 转载请注明出处 http://blog.csdn.net/meiwm 谢谢>


作者:meiwm
出处: http://blog.csdn.net/meiwm
本文为原创,本文版权归作者所有。欢迎转载,但请务必保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。

-

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值