在对变量进行运算时,如果表达式运算结果依然对变量自身赋值,如:
a=a+1;a=a*3;a=a-1;
等表达式,我们可以对其进行简写,可以写成:
a+=1;a*=3;a-=1;
上述表达式中的"+="、"*="、"-="叫作复合赋值运算符,在C、C++中,复合赋值运算符还有另外的几个。
对于上述复合赋值运算符中的两种情况,即:a+=1和a-=1,又有进一步的简写:
a++;++a;a--;--a;
其中的运算符"++"称为自加运算符,"--"称为自减运算符,如果仅仅只是对变量a进行单独的运算,运算符放在变量a前面或者放在其后面都没有区别。
只有当变量a需要在表达式中参与运算时,也即需要使用该变量时,才需要区分自增、自减运算符的位置。
1、++a,--a表示在使用a之前,即取a的值参与表达式中的运算之前,先完成自增或自减运算;
2、a++,a--表示在使用之后在对变量a进行自增、自减运算,也即表达式直接取变量a当前的值进行运算,当变量a所在表达式运算结束之后,再完成变量a的自增、自减运算。
综合以上解释,对如下代码:
#include
int main(void){
int a,b,c;
a=2;
b=3;
c=(a++)*(b++)*(++a)*(a--)*(--b);
printf("c=%d\n",c);
printf("a=%d\tb=%d",a,b);
retrun 0;
}
先根据上述解释,推测a、b、c运算之后的结果:
由于表达式括号外都是乘法运算,从左往右看就行,现在只需要确定各括号内的值:
a++:表示取a当前值2进行运算,并在整个表达式运算结束进行1次自增;
b++:表示取b当前值3进行运算,并在整个表达式运算结束进行1次自增;
++a:表示将a的当前值加1参与运算,即用a=2+1=3进行运算,此后a的值为3;
a--:表示取a当前值3参与运算,并在整个表达式运算结束进行1次自减;
--b:表示将b的当前值减1参与运算,即用b=3-1=2进行运算,此后b的值为2。
由此可知:c=2*3*3*3*2=108;a=3+1-1=3;b=2+1=3
程序运行结果如下:
可见,结果和推测的结果完全一致。
值得注意的是,推测时是按表达式中运算符的优先级和结合方向逐个计算的,理论上编译器也都是按这个顺序编译的,但我也不确定这一点,望指正!
此外,需要注意不管是哪一种复合赋值运算符,都是针对变量而言的,对于常量不能这么搞。
主要情形:用数组名作为函数的实参和形参时,混淆了数组名和指针变量的用法——
即:如果将指针变量pA指向一个一维数组A[N],那么在进行引用数组元素,比如循环输出所有元素时,可以用下标法进行索引,也可以用指针法,有如下代码:
int main(int argc, char* argv[]) {
char A[6] = "China";
char* pA;
pA = A;
//第一种:直接用下标索引,人畜无害
for (int i = 0; A[i] != '//第三种:直接用数组名作为索引,并对数组名进行自增运算,以图改变指向
for (; *(A) != '';) {
printf("%c", *(A++));
}
printf("\n");
'; i++) {
printf("%c", A[i]);
}
printf("\n");
//第二种:定义指针变量指向数组首元素,往后对指针变量自增运算,以改变指向,这也是正确的
for (; *(pA) != '';) {
printf("%c", *(pA++));
}
printf("\n");
system("pause");
return 0;
}
上述两种结果如下:
由于数组名A表示数组A[N]的首元素地址,pA最开始也是指向数组A[N]的首元素地址,初学者就容易将二者的用法搞混,误以为也可以用数组名进行同样的 *** 作:
可见有如下错误提示:
以上唯一一个错误的地方就是:"A++",这是因为A作为数组名,代表数组首元素地址,它是一个常量,无法像指针变量pA一样进行自增运算,出现这种错误的原因,无非就是对常量、变量的性质,以及对运算符的功能理解不透彻。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)