sizeof 操作符 和算术运算符优先级

      使用sizeof的结果部分地依赖所涉及的类型

     1)对char类型或值为char类型的表达式做sizeof操作保证得1;

     2)对引用类型做sizeof操作将返回存放此引用类型对象所需的内存空间大小;

     3)对指针做sizeof操作将返回存放指针所需的内存大小;注意,如果要获取该指针所指向对象的大小,则必须对该指针进行解引用;

     4)对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数;因为sizeof返回整个数组在内存中的存储长度,所以用sizeof数组的结果除以sizeof其元素类型的结果,即可求出数组元素的个数。

 

 eg:char *ss1 = "014256";

       char ss2[] = "012345689";

       char ss3[100] = "0124356";

       int ss4[100];

       char q1[] = "abl";

       char  q2[] =  "a/n";

       char  *q3 = "a/n";

       char *str1 = ( char * ) malloc(100);

       void *str2 = ( void * ) malloc(100);

      

                                //结果:

       sizeof( ss1 );     //4,因为ss1为其存放地址的大小

       sizeof ( ss2 );    //10

       sizeof ( ss3 );    //100

       sizeof ( ss4 );    //400

       sizeof ( q1 );      //4

       sizeof ( q2 );      //3

       sizeof ( q3 );      //4

       sizeof ( str1);    //4

       sizeof ( str2 );     //4

 

     1)指针的大小是一个定值为4;

     2)若求结构体的大小,当结构体内元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说,结构体的长度一定是最长的数据元素的整数倍;

     3)对于一个类而言,若它是一个空类,它的空间大小为1;

     4)若一个类中只有虚函数,则其大小为4,因为类中的成员函数,构造函数和析构函数不占用内存空间.若有虚函数或虚继承,则在类中就会有一个虚表,则虚表指针的大小为4;

   eg:

        class a {

        };

        class a2

        {

          };

        class b:public a 

        {

        };

        class c:public virtual b

        {

          };

        class d: public a, public a2

        {

        };

 

                                 //结果如下:

        sizeof (a);         //1

        sizeof (b);         //1

        sizeof (c);        //4,虚继承涉及到虚表(虚指针),所以为4;

        sizeof (d);         //1

 

 


2、算术运算符优先级

C++操作符的优先级

操作符及其结合性

功能

用法

L
L
L
::
::
::
全局作用域
类作用域
名字空间作用域
::name
class::name
namespace::name
L
L
L
L
L
.
->
[]
()
()
成员选择
成员选择
下标
函数调用
类型构造
object.member
pointer->member
variable[expr]
name(expr_list)
type(expr_list)
R
R
R
R
R
++
--
typeid
typeid
显示强制类型转换
后自增操作
后自减操作
类型ID
运行时类型ID
类型转换
lvalue++
lvalue--
typeid(type)
typeid(expr)
cast_name<type>(expr)
R
R
R
R
R
R
R
R
R
R
R
R
R
R
sizeof
sizeof
++
--
~
!
-
+
*
&
()
new
delete
delete[]
对象的大小
类型的大小
前自增操作
前自减操作
位求反
逻辑非
一元负号
一元正号
解引用
取地址
类型转换
创建对象
释放对象
释放数组
sizeof expr
sizeof(type)
++lvalue
--lvalue
~expr
!expr
-expr
+expr
*expr
&expr
(type)expr
new type
delete expr
delete []expr
L
L
->*
.*
指向成员操作的指针
指向成员操作的指针
ptr->*ptr_to_member
obj.*ptr_to_member
L
L
L
*
/
%
乘法
除法
求模(求余)
expr * expr
expr / expr
expr % expr
L
L
+
-
加法
减法
expr + expr
expr - expr
L
L
<<
>>
位左移
位右移
expr << expr
expr >> expr
L
L
L
L
<
<=
>
>=
小于
小于或等于
大于
大于或等于
expr < expr
expr <= expr
expr > expr
expr >= expr
L
R
==
!=
相等
不等
Expr == expr
Expr != expr
R&位与 Expr & expr
R^位异或 Expr ^ expr
R|位或 Expr | expr
R&&逻辑与 Expr && expr
R||逻辑或 Expr || expr
R?:条件操作 Expr ? expr : expr
R
R
R
R
R
=
*=,/=,%=
+=,-=
<<=,>>=
&=,|=,^=
赋值操作
符合赋值操作

Lvalue= expr
Lvalue+= expr
……

Rthrow抛出异常 Throw expr
L,逗号 Expr, expr

 

记忆方法:
--摘自《C语言程序设计实用问答》 -吕凤翥 吕 涛著
问题:如何记住运算符的15种优先级和结合性?
解答:C语言中运算符种类比较繁多,优先级有15种,结合性有两种。
如何记忆两种结合性和15种优先级?下面讲述一种记忆方法。
结合性有两种,一种是自左至右,另一种是自右至左,大部分运算符的结合性是自左至右,只有单目运算符、三目运算符的赋值运算符的结合性自右至左。
优先级有15种。记忆方法如下:
记住一个最高的:构造类型的元素或成员以及小括号。
记住一个最低的:逗号运算符。
剩余的是一、二、三、赋值。
意思是单目、双目、三目和赋值运算符。
在诸多运算符中,又分为:
算术、关系、逻辑。
两种位操作运算符中,移位运算符在算术运算符后边,逻辑位运算符在逻辑运算符的前面。再细分如下:
算术运算符分 *,/,%高于+,-。
关系运算符中,>,>=,<,〈=高于==,!=。
逻辑运算符中,除了逻辑求反(!)是单目外,逻辑与(&&)高于逻辑或(||)。
逻辑位运算符中,除了逻辑按位求反(~)外,按位与(&)高于按位半加(^),高于按位或(|)。
这样就将15种优先级都记住了,再将记忆方法总结如下:
去掉一个最高的,去掉一个最低的,剩下的是一、二、三、赋值。双目运算符中,顺序为算术、关系和逻辑,移位和逻辑位插入其中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值