关于c++中逻辑与&&和逻辑或||的问题
“假设a=0,b=6,c=7。表达式a++&&b++&&c++运算完成后,整个表达式的值为false(或0),a的值为1,b和c的值不变。表达式a++||b++||c++...
“假设a=0,b=6,c=7。
表达式a++&&b++&&c++运算完成后,整个表达式的值为false(或0),a的值为1,b和c的值不变。
表达式a++||b++||c++运算完成后整个表达式的值为true(或1),a的值为1,b的值为7,c的值不变。”
请问一下这两个表达式的详细运算过程是怎么样的?(就是说一下a,b,c的值是如何变化的以及整个表达式的值是怎么出来的,两个式子分别说一下) 展开
表达式a++&&b++&&c++运算完成后,整个表达式的值为false(或0),a的值为1,b和c的值不变。
表达式a++||b++||c++运算完成后整个表达式的值为true(或1),a的值为1,b的值为7,c的值不变。”
请问一下这两个表达式的详细运算过程是怎么样的?(就是说一下a,b,c的值是如何变化的以及整个表达式的值是怎么出来的,两个式子分别说一下) 展开
6个回答
展开全部
LZ 我在 VS 2008 用如下代码做了测试
#include<iostream>
int main()
{
int a(0), b(6), c(7);
std::cout << (a++&&b++&&c++) << std::endl;
std::cout << a << std::endl;
std::cout << b << std::endl;
std::cout << c << std::endl;
return 0;
}
显示为
0
1
6
7
也就是只有 a 递增了,b c 不变。我觉得这样才符合我所学的解释。
对于 a++&&b++&&c++ 这个表达式,
首先从运算符优先级(Precedence)分析为:
(a++)&&(b++)&&(c++) 即,所有 后置递增‘++’应该先运算。
然后 从 && 的集合性(Associativity)分析
((a++)&&(b++))&&(c++) 即,从左到右先计算左边的‘&&’,即 (a++)&&(b++)
最后,也是最关键的一个步骤就是 C++ 标准对 && || 两个运算符有特殊的规定:
短路求值(short-circuit evaluation) —— 简单的说,有表达式 A&&B 其中 A,B 分别是两个表达式,编译器会先计算左边的 A 的值,如果A 的值为 0,则不管 B 的值最后是多少都不影响 A&&B 的结果了(A&&B 的结果已经提前由 A 决定了为 0 对不?),那么编译器就不再对 B 求值了,A&&B 只计算了 A 就直接返回为 0了。
所以这里 ((a++)&&(b++))&&(c++),由于第一个 && 的左边 a++ 返回 0,所以 b++ 被略过,以此类推 c++ 也应该被略过
这样最终 只有 a++ 被求值,b++ c++ 被忽略,a++&&b++&&c++返回0
#include<iostream>
int main()
{
int a(0), b(6), c(7);
std::cout << (a++&&b++&&c++) << std::endl;
std::cout << a << std::endl;
std::cout << b << std::endl;
std::cout << c << std::endl;
return 0;
}
显示为
0
1
6
7
也就是只有 a 递增了,b c 不变。我觉得这样才符合我所学的解释。
对于 a++&&b++&&c++ 这个表达式,
首先从运算符优先级(Precedence)分析为:
(a++)&&(b++)&&(c++) 即,所有 后置递增‘++’应该先运算。
然后 从 && 的集合性(Associativity)分析
((a++)&&(b++))&&(c++) 即,从左到右先计算左边的‘&&’,即 (a++)&&(b++)
最后,也是最关键的一个步骤就是 C++ 标准对 && || 两个运算符有特殊的规定:
短路求值(short-circuit evaluation) —— 简单的说,有表达式 A&&B 其中 A,B 分别是两个表达式,编译器会先计算左边的 A 的值,如果A 的值为 0,则不管 B 的值最后是多少都不影响 A&&B 的结果了(A&&B 的结果已经提前由 A 决定了为 0 对不?),那么编译器就不再对 B 求值了,A&&B 只计算了 A 就直接返回为 0了。
所以这里 ((a++)&&(b++))&&(c++),由于第一个 && 的左边 a++ 返回 0,所以 b++ 被略过,以此类推 c++ 也应该被略过
这样最终 只有 a++ 被求值,b++ c++ 被忽略,a++&&b++&&c++返回0
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a++&&b++&&c++中,从左到右计算,先计算a++,(a++)==0,在逻辑与中,当从左到右计算到某一数组已经是false(或0)了,编译器就不会计算后面的了(因为再计算下去对这式子已经没意义了,式子已经是false(或0)了),然后就没计算b和c...注:(a++)的这句的值为0(因为之前a==0),但a在参与完计算后才自增1,你要换成是++a就不同了;
a++||b++||c++中,一个为false(或0)无法对语句产生必然结果,所以编译器需要将a.b.c计算完才能得出式子结果,就自然把a.b.c全计算了(即全部自增1),但对编译器来说这个式子就是计算0||6||7是否为真,然后才将a.b.c自增1...
a++||b++||c++中,一个为false(或0)无法对语句产生必然结果,所以编译器需要将a.b.c计算完才能得出式子结果,就自然把a.b.c全计算了(即全部自增1),但对编译器来说这个式子就是计算0||6||7是否为真,然后才将a.b.c自增1...
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你搜一下“猝死法”就知道了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询