求C语言大神给我讲解下下图中的c=(a-=a-5),(a=b,b+3); 的运算过程以及中间逗号的意思
下图是代码,求大神给我讲解一下这句话的运算过程c=(a-=a-5),(a=b,b+3);以及中间逗号的意思...
下图是代码,求大神给我讲解一下这句话的运算过程 c=(a-=a-5),(a=b,b+3);以及中间逗号的意思
展开
5个回答
展开全部
首先,请搞明白一种表达式叫逗号表达式,就是将一组语句连着写出来,中间用逗号分隔;表达式的取值是最后一个语句的取值。
c=(a-=a-5),(a=b,b+3); 这个语句是一个逗号表达式,前面的语句是c=(a-=a-5);后面的语句是(a=b,b+3);后面的语句也是个逗号表达式,整个表达式的值没有处理,所以不关心。
计算:
a-=a-5;即a-=-5;即a+=5;结果a=5
c=(a-=a-5)结果c=5,a=5
a=b结果a=0
b+3运算了等于3但没有保存结果,对a,b,c的值不产生影响
(a=b,b+3)的值是3,即b+3的结果,但这个结果也没有保存,对a,b,c的值不产生影响
最终:a=0,b=0,c=5
展开全部
逗号运算符:
在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
逗号运算:
在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
例如:
int a1,a2,b=2,c=7,d=5;
a1=(++b,c--,d+3);
a2=++b,c--,d+3;
对于给a1赋值的代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是(d+3)的值,为8,所以a1的值为8。
对于给a2赋值的代码,也是有三个表达式,这时的三个表达式为a2=++b、c--、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但a2=4(第2行代码运算完时,b=3,即第3行代码运行时,b的值为4)。
注意事项:
逗号运算的结合性是从左至右,完毕之后整个表达式的值是最后一个表达式的值。
例子:int a[2],x=2,y=5;
a[0]=(x+3,y++,x++);那么最终结果是:a[0]=2 x=3 y=6;
为何a[0]=2:因为(x++)是运算之后再自加
a[1]=(x++,x+3,x+7);那么最终结果是:a[1]=11 ,x=4
第一反应,我以为a[1]=10,就是3+7;其实是错的。
计算a[0]的时候,x++了一次,此时x=3;计算a[1]的时候,又x++一次,此时x=4,因此a[1]=4+7=11
不信你改成a[1]=(x++,x+7,x+3);调试一下,逗号表达试结果是7,就是4+3,说明经过一个逗号,x已经自加变成4了。[1]
再来一个关于结合性的例子:
int i=24;
i=(i++,i++,i++,i++);//i=27
因为逗号运算符的结合性是自左向右,所以四个i++会依次运行,但是最后一个i++在赋值之后才进行运算,所以最终返回27
在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
逗号运算:
在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
例如:
int a1,a2,b=2,c=7,d=5;
a1=(++b,c--,d+3);
a2=++b,c--,d+3;
对于给a1赋值的代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是(d+3)的值,为8,所以a1的值为8。
对于给a2赋值的代码,也是有三个表达式,这时的三个表达式为a2=++b、c--、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但a2=4(第2行代码运算完时,b=3,即第3行代码运行时,b的值为4)。
注意事项:
逗号运算的结合性是从左至右,完毕之后整个表达式的值是最后一个表达式的值。
例子:int a[2],x=2,y=5;
a[0]=(x+3,y++,x++);那么最终结果是:a[0]=2 x=3 y=6;
为何a[0]=2:因为(x++)是运算之后再自加
a[1]=(x++,x+3,x+7);那么最终结果是:a[1]=11 ,x=4
第一反应,我以为a[1]=10,就是3+7;其实是错的。
计算a[0]的时候,x++了一次,此时x=3;计算a[1]的时候,又x++一次,此时x=4,因此a[1]=4+7=11
不信你改成a[1]=(x++,x+7,x+3);调试一下,逗号表达试结果是7,就是4+3,说明经过一个逗号,x已经自加变成4了。[1]
再来一个关于结合性的例子:
int i=24;
i=(i++,i++,i++,i++);//i=27
因为逗号运算符的结合性是自左向右,所以四个i++会依次运行,但是最后一个i++在赋值之后才进行运算,所以最终返回27
追问
如果按照你这么说C的值是逗号运算符里面的最后一个,那C的值应该是3才对,为什么编译出来的结果是C的值是5呢?
c=(a-=a-5),(a=b,b+3); (不是运算最后一个b+3 ?)
追答
你误解了,c的值是左面括号里运算结果的值,也就是说c等于5;
然后计算逗号右面括号,先计算a = b, 把b的值0赋与a,此时a等于0;再计算b+3,b就等于3,第二个括号里没有运算c的值,所以c并没有改变.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2016-08-23
展开全部
中间的逗号起到分隔作用,逗号是一个双目运算符
(A,B)返回的是B的值,同时逗号是从左往右算,所以先算A
(a-=a-5) 中,先算a-5还是 -= ?要看运算符优先级,-比-=高,所以先算a-5 =-5
然后a-=-5,此时a仍未0,所以该表达式为5
第二个同理
(a=b,b+3)返回的是b+3
值得一提的是,由于逗号比赋值优先级低,所以c=(A,B),(C,D)实际上是
c=(A,B),返回的是B
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是逗号运算符 ,你可以百度一下 运算符的优先级 ,可以看到所有的运算符,然后看下逗号运算符的使用。
这有两个表达式 c=(a-=a-5) (a=b,b+3) 这个表达式里面又有2个表达式
=优先级别会高于逗号,c=5, a=0 b=0 整个表达式的值会是3,
这有两个表达式 c=(a-=a-5) (a=b,b+3) 这个表达式里面又有2个表达式
=优先级别会高于逗号,c=5, a=0 b=0 整个表达式的值会是3,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询