一次为多个变量赋值的方法
- 一、批量赋值
- 1.1 批量赋值的方式、命名
- 1.2 批量定义、批量赋值
- 二、批量改值
- 三、运算次序
- 四、补充说明
一、批量赋值
1.1 批量赋值的方式、命名
在对C语言赋值时,可以使用下面这种简化的形式对多个变量赋初值。
int a, b, c;
a=b=c=1;
有些书中将这种赋值方式说成是“连等式”
,这种说法是不严谨的。
连等式是一个数学概念,指含有两个或两个以上的等号的等式。从形式上a=b=c=1是符合这个定义的,但却忽略了一个问题:C语言中的等号是“赋值运算符”,表示将右侧的值赋给左侧的变量,而并不表示等号左右两边相等,它与数学中的等号意义是完全不同的。
也就是说,在C语言里,上述式子连等式都算不上,连等式就更无从谈起。
有的书上称之为“串联赋值”,意思是把多个等号串联起来赋值,这种叫法更合理些;还有的地方叫“链式赋值”,意思差不多,老金更愿意称之为“连赋值”(正好与连等式相对应)。
1.2 批量定义、批量赋值
要注意一点:不能像下面这样批量搞定变量的定义和赋值:
int a=b=c=1; //编译出错
编译报错:
error: ‘b’ undeclared (first use in this function)
error: ‘c’ undeclared (first use in this function)
提示得很明显了吧?因为这行语句实际上只定义了第一个变量a,变b、c都在等号后面,是没有被定义的。像下面一样提前定义一下就OK了。
int b, c; //提前定义变量
int a=b=c=1; //OK
如果非要在一条语句中同时实现批量定义和批量赋值,可以这样:
int b, c, a=b=c=1; //批量定义+指量赋值
二、批量改值
在已赋初值的前提下,还可以用组合运算符一次改变多个变量的值。
int a=1, b=1, c=1;
a+=b-=c*= 1;
三、运算次序
批量赋值是从右向左依次计算的。这其实很好理解,因为赋值就将等号右侧的值赋给左边的变量,就像从右向左传球一样,所以如果有一堆串联的等号,值的源头一定是在最右边,故而也自然从最右边算起。
前面提到的a+=b-=c*= 1;按从右向左可以解析为以下代码:
c*= 1; //c=c*1=1*1=1
b-=c; //b=b-c=1-1=0
a+=b; //a = a+b=1+0=1
有兴趣的可以尝试一下以下完整代码:
#include<stdio.h>
int main(){int a=0,b=0,c=0; //不能用a=b=c= 0的形式,否则报错a=b=c=1;//这是可以通过编译的,a,b,c的值都赋值为1printf("%d %d %d\n", a, b, c);a+=b-=c*= 1; //也可以用组合的运算符printf("%d %d %d\n", a, b, c);return 0;
}
四、补充说明
最后,需要强调的一点是,这种赋值方式看以高效便捷,但对看代码的人并不友好,在有组合运算符时,有时会很难理解,比如下面的代码:
a+=a-= a*a;
a^=b^=a^=b;
这还算好的,用得不好还会出现神经错乱,详见:神经错乱的连赋值
所以,作为编程人员,知道怎么求解此类题目即可,在编写代码时不推荐用这种赋值方式。