LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1540|回复: 15

刚开始学c,今天有道习题弄不懂!

[复制链接]
发表于 2005-5-6 09:05:05 | 显示全部楼层 |阅读模式
代码如下
  1. [FONT=Fixedsys]
  2. #include <stdio.h>

  3. main ()
  4. {
  5.     int a, b, c;
  6.     a = 0;
  7.     b = 0;
  8.     c = 0;

  9.     c = ( a -= a - 5 ), ( a = b, b + 3);
  10.     printf( "%d, %d, %d\n", a, b, c );
  11. }
  12. [/font]
复制代码

选择题,问a,b,c三者值各多少,答案是0,0,5三个值,可是我不知道原理,我C菜鸟,请各位老大讲解一下! :ask
发表于 2005-5-6 11:25:30 | 显示全部楼层
Your confusion is as bellow???
   c = ( a -= a - 5 ), ( a = b, b + 3);
In fact it's noting but the sequence of Operator.
the orginal a'value is 0,and then you can imagine there is temp V=a-5.the V 's  vlaue is =-5 ,then execute c=a-=V,which means "c=a-V"(a=0,v=-5),so c=5.
As a=b,because b=0,so a=0 while b+3----------->this does't assign any value to b,so b is still 0.
Sorry for my poor english and for my possible wrong interpretation.
回复 支持 反对

使用道具 举报

发表于 2005-5-7 23:04:50 | 显示全部楼层
找本讲C/C++的书,参见逗号表达式

c = ( a -= a - 5 ), ( a = b, b + 3);
~~~~~~~~~~1~~~~~~~  ~~~~~~~~2~~~~~~~

想必你也会清楚 d=(c = ( a -= a - 5 ), ( a = b, b + 3));后d的值
回复 支持 反对

使用道具 举报

发表于 2005-5-8 08:10:43 | 显示全部楼层
好好看一本C的书就知道了.
回复 支持 反对

使用道具 举报

发表于 2005-5-8 19:48:36 | 显示全部楼层
 逗号运算符

  C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接起来组成一个表达式, 称为逗号表达式。

  其一般形式为: 表达式1,表达式2 其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。

void main(){
 int a=2,b=4,c=6,x,y;
 y=(x=a+b),(b+c);
 printf("y=%d,x=%d",y,x);
}
a<--2,b<--4,c<--6,x<--0,y<--0
x<--a+b,y<---b+c  

  本例中,y等于整个逗号表达式的值,也就是表达式2的值,x是第一个表达式的值。对于逗号表达式还要说明两点:

  1.逗号表达式一般形式中的表达式1和表达式2 也可以又是逗号表达式。例如: 表达式1,(表达式2,表达式3) 形成了嵌套情形。因此可以把逗号表达式扩展为以下形式: 表达式1,表达式2,…表达式n 整个逗号表达式的值等于表达式n的值。

  2.程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。

  3.并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用作各变量之间的间隔符
回复 支持 反对

使用道具 举报

发表于 2005-5-8 20:11:28 | 显示全部楼层
2.11 逗号运算符和逗号表达式
一、逗号运算符的特性及作用
  逗号运算符的作用是将若干表达式连接起来。它的优先级别在所有运算符中是最低的,结合方向是"自左至右"的。
  如:3*3,4*4
二、逗号表达式
  逗号表达式的一般形式是:表达式1,表达式2,表达式3……表达式n
  逗号表达式的求解过程是:先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值。最后整个逗号表达式的值是表达式n的值。
  看下面几个例子:
x=8*2,x*4 /*整个表达式的值为64,x的值为16*/
(x=8*2,x*4),x*2 /*整个表达式的值为128,x的值为16*/
x=(z=5,5*2) /*整个表达式为赋值表达式,它的值为10,z的值为5*/
x=z=5,5*2 /*整个表达式为逗号表达式,它的值为10,x和z的值都为5*/
  逗号表达式用的地方不太多,一般情况是在给循环变量赋初值时才用得到。所以程序中并不是所有的逗号都要看成逗号运算符,尤其是在函数调用时,各个参数是用逗号隔开的,这时逗号就不是逗号运算符。
如:printf("%d,%d,%d",x,y,z);

  到现在为止,我们已经把C语言中的基本运算符和一些基本的表达式学习过了。有了这些基础,我们就可以开始编程序了!让我们为了明天,继续奋斗吧!
回复 支持 反对

使用道具 举报

发表于 2005-5-8 20:27:25 | 显示全部楼层
#include <stdio.h>
void main ()
{
    int a, b, c,d;
    a = 0;
    b = 0;
    c = 0;

    d=(c = ( a -= a - 5 ), ( a = b, b + 3));
    printf( "%d, %d, %d, %d\n", a, b, c ,d );
}


运行后 0,0,5,3
回复 支持 反对

使用道具 举报

发表于 2005-5-8 20:33:48 | 显示全部楼层
d=(c = ( a -= a - 5 ), ( a = b, b + 3));  /*c=a-=(a-5),
                                                                   c=(a-(a-5))
                                                                       (a=0,c=5)
                                                               d=(a=b,b+3)
                                                                    a=b
                                                                         (a=b=0)
                                                                    d=b+3
                                                                        (b=0,d=3)


不知是不是这样,我也是新手,希望高手指正
回复 支持 反对

使用道具 举报

发表于 2005-5-8 20:44:23 | 显示全部楼层
总之就是说等号比逗号优先级高。这题没什么好研究的。
回复 支持 反对

使用道具 举报

发表于 2005-5-8 21:49:54 | 显示全部楼层
c = ( a -= a - 5 ), ( a = b, b + 3);
汗…………我就纳了闷了,怎么有朋友说取逗号最后的一个表达式的值???C明明规定逗号表达式是取第一个逗号前面的表达式的值,放到这里,其实就是c=(a-=a-5),扩展开来看:①a-5=-5;
②a=a-(-5),其实就是a=0-(-5),0-(-5)等于多少??我特意打开计算器算了一下,等于5,所以最后c的值就是5。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表