一 变量
(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 谢谢>
出处:
http://blog.csdn.net/meiwm
本文为原创,本文版权归作者所有。欢迎转载,但请务必保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。
-
本文介绍了C++中的变量声明、全局变量的使用,详细讲解了各种运算符,包括+=, -=, *=, /=以及i++和++i的区别。强调了自增/减操作符在混合运算中的风险,指出不同编译器可能产生的不同结果,并提供了VC11和Java中性能比较的观察。"
111543932,8759932,Cisco IPS: 配置告警与日志动作策略,"['运维', '网络安全', '思科', 'ids']
14万+

被折叠的 条评论
为什么被折叠?



