逗号运算符实质上,就是把两个或者多个表达式放一起,会被编译器认为是一个表达式。
表达式 的定义:任何值或任何有效的值和运算符的组成是表达式。
以下不是表达式:
int a , b ; 其中a,b分别是一个变量,
我们可以int a; int b; 这样是声明a是int类型,b是int类型。
也可以int a, b; 这样是声明a和b都是int类型。
在这里有点类似 “和” 的意思。——但记住,不是每个都可以这么理解,特别是在输出 表达式的值 的时候
以下是表达式:
又例如在for循环语句里,小括号里面的三个语句,是被分号隔起来的。
for(i=1;i<5;i++)
其中i=1、i<5和i++都是表达式。
这三个表达式,也可以用逗号运算符。
上代码:
#include<iostream> int main() { using namespace std; int a, b; for (a = 1, b = 3;a < 2, b < 6;a++, b++) { cout << "第" << a << "遍循环" << endl; cout << a << endl; cout << b << endl; } cout << "循环已经结束" << endl; cout << a << endl; cout << b << endl; system("pause"); return 0; }
输出:
第1遍循环 1 3 第2遍循环 2 4 第3遍循环 3 5 循环已经结束 4 6 请按任意键继续. . .
问题:
①从结果来看,结束循环是因为b不小于6,而不是a<2。
即:逗号前的判断 未满足 并没有影响到判断,逗号后的判断 未满足 ,循环结束。即a<2并没有影响结果。
——这里有一种猜想,是不是因为两个表达式都不满足后,循环结束。至少满足一个表达式,循环继续进行。
然而,在测试中被否决,在另外一个for中,第一个表达式满足,第二个表达式不满足,循环结束。——即只有一个表达式不满足,但循环依然结束。
另外,在之前,我们分析到for语句的判断语句,是将表达式转为bool类型,满足值为1,不满足值为0,当值为0时结束判断语句。
最后发现:
第一个表达式是否满足,并不影响循环执行;
若第二个表达式的值为false,则循环停止。
②因此,逗号运算符,在for循环判断语句的时候,不能理解为“和”,这就涉及到,由逗号运算符连接多个表达式一起的话,这个表达式的值为什么。
见下一部分。
逗号前后多个表达式的值(表达式的值):
假如逗号将两个表达式连接在一起,如a<3,b<4;
那么这个表达式的值为多少?
上代码:
#include<iostream> int main() { using namespace std; int a = 1, b = 5, c; cout.setf(ios_base::boolalpha); cout << "(a < 4, b>6) = " << (a < 4, b>6) << endl; //逗号前a<4是true,逗号后b>6是flase cout << "(a = 3, b = 9) = " << (a = 3, b = 9) << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "(a = 3, b = 9 , c=5 ) = " << (a = 3, b = 9, c = 5) << endl; system("pause"); return 0; }
输出:
(a < 4, b>6) = false (a = 3, b = 9) = 9 a = 3 b = 9 (a = 3, b = 9 , c=5 ) = 5 请按任意键继续. . .
结论:
①有逗号参与的多个表达式,他们的值永远表现的是最后一个表达式的值。
②因此,在for循环语句的判断语句中,是否执行循环,判断的是最后一个表达式的值是true还是false。
③变量名=30 这种形式的表达式,值为30