详解C++中二进制求补运算符与下标运算符的用法
二进制求补运算符:~
语法
~cast-expression
备注
二进制反码运算符(~)(有时称为“按位反码”运算符)将生成其操作数的按位二进制反码。即,操作数中为1的每个位在结果中为0。相反,操作数中为0的每个位在结果中为1。二进制反码运算符的操作数必须为整型。
~的运算符关键字
compl运算符是~的文本等效项。访问程序中的compl运算符有两种方式:包括头文件iso646.h,或使用/Za进行编译。
//expre_One_Complement_Operator.cpp //compilewith:/EHsc #include<iostream> usingnamespacestd; intmain(){ unsignedshorty=0xFFFF; cout<<hex<<y<<endl; y=~y;//Takeone'scomplement cout<<hex<<y<<endl; }
在此示例中,分配给y的新值是无符号值0xFFFF或0x0000的二进制反码。
将对整型操作数执行整型提升,并且结果类型将是操作数将提升到的类型。
下标运算符:[]
postfix-expression[expression]
备注
后跟下标运算符[]的后缀表达式(也可为主表达式)指定数组索引。
通常,postfix-expression表示的值是一个指针值(如数组标识符),expression是一个整数值(包括枚举类型)。但是,从语法上来说,只需要一个表达式是指针类型,另一个表达式是整型。因此整数值可以位于postfix-expression位置,指针值可以位于expression的方括号中或下标位置。考虑以下代码片断:
intnArray[5]={0,1,2,3,4}; cout<<nArray[2]<<endl;//prints"2" cout<<2[nArray]<<endl;//prints"2"
在前面的示例中,表达式nArray[2]与2[nArray]相同。原因是下标表达式e1[e2]的结果由以下所示给定:
*((e2)+(e1))
该表达式生成的地址不是e1地址中的e2字节。相反,该地址将进行缩放以生成数组e2中的下一个对象。例如:
doubleaDbl[2];
aDb[0]和aDb[1]的地址相距8字节-double类型的对象的大小。根据对象类型进行的缩放将由C++语言自动完成,并在其中讨论了指针类型的操作数的加减法的相加运算符中定义。
下标表达式还可以有多个下标,如下所示:
expression1[expression2][expression3]...
下标表达式从左至右关联。首先计算最左侧的下标表达式expression1[expression2]。通过添加expression1和expression2得到的地址构成一个指针表达式;然后expression3将添加到此指针表达式,从而构成一个新的指针表达式,依此类推,直到添加最后一个下标表达式。在计算了最后的subscripted表达式后,将应用间接寻址运算符(*),除非最终指针值将为数组类型寻址。
具有多个下标的表达式引用多维数组的元素。多维数组是其元素为数组的数组。例如,三维数组的第一个元素是一个具有两个维度的数组。以下示例声明并初始化字符的简单二维数组:
//expre_Subscript_Operator.cpp //compilewith:/EHsc #include<iostream> usingnamespacestd; #defineMAX_ROWS2 #defineMAX_COLS2 intmain(){ charc[MAX_ROWS][MAX_COLS]={{'a','b'},{'c','d'}}; for(inti=0;i<MAX_ROWS;i++) for(intj=0;j<MAX_COLS;j++) cout<<c[i][j]<<endl; }
正下标和负下标
数组的第一个元素是元素0。C++数组的范围是从array[0]到array[size–1]。但是,C++支持正负下标。负下标必须在数组边界内;否则结果不可预知。以下代码显示了正数组和负数组下标:
#include<iostream> usingnamespacestd; intmain(){ intintArray[1024]; for(inti=0,j=0;i<1024;i++) { intArray[i]=j++; } cout<<intArray[512]<<endl;//512 int*midArray=&intArray[512];//pointertothemiddleofthearray cout<<midArray[-256]<<endl;//256 cout<<intArray[-256]<<endl;//unpredictable }
上一行中的负下标可能产生运行时错误,因为它在内存中指向比数组的原点低256个字节的地址。指针midArray会初始化为intArray的中点;因此可以对其使用正数组和负数组索引。数组下标错误不会产生编译时错误,但它们会产生不可预知的结果。
下标运算符是可交换的。因此,只要没有重载下标运算符(请参阅重载运算符),表达式array[index]和array[array]就一定等效。第一种形式是最常见的编码做法,但它们都有效。