黑马程序员技术交流社区

标题: 大神帮我看下这题,谢谢 [打印本页]

作者: Dmajor    时间: 2014-4-19 10:31
标题: 大神帮我看下这题,谢谢
本帖最后由 Dmajor 于 2014-4-20 00:28 编辑

大神帮我看下这题,谢谢
  1. main()
  2. {int a,b,k=4,m=6,*p1=&k,*p2=&m;
  3. a=p1==&m;
  4. b=(-*p1)/(*p2)+7;
  5. printf("a=%d\n",a);
  6. printf("b=%d\n",b);
  7. }
复制代码


这题答案0,7是怎么来的?     a=p1==&m;这句我看不懂,什么m的地址等于k的地址又赋给a。
作者: 微尘•逐梦    时间: 2014-4-19 10:43
分析内容在程序中给出
  1. main()
  2. {int a,b,k=4,m=6,*p1=&k,*p2=&m;
  3. a=p1==&m;//等价于a=(p1==&m),因为p1=&k,所以p1==&m的值是0,所以a=0。
  4. b=(-*p1)/(*p2)+7;//*p1=k=4,p2=m=6,(-4/6)的值是0,所以b=0+7
  5. printf("a=%d\n",a);
  6. printf("b=%d\n",b);
  7. }
复制代码

所以输出是0,7
作者: blz01003hm    时间: 2014-4-19 10:46
main()
{int a,b,k=4,m=6,*p1=&k,*p2=&m;
a=p1==&m;      //等于 a=(p1==&m)即p1是否等于&m 两个地址比较 等就把1赋给a 不等把0赋给a即a=0
b=(-*p1)/(*p2)+7;   //等于b=(-4)/(6)+7 有于-4/6等于0.666....b为int型 取整数部分 即0即0+7即b=0+7
printf("a=%d\n",a);
printf("b=%d\n",b);
}
作者: 愿我能    时间: 2014-4-19 15:49
  1. 运算符优先级:  乘、除、求余*   /  %加、减 < <=  >  >=        小于、大于、小于等于、大于等于        = =   !=        等于、不等于//左边的依次大于右边的
  2. a=p1==&m 所以相当于先计算p1==&m &符号表示取该数据的内存地址,显然p1指向的k地址,与m地址不同 ,而c语言的布尔运算只有0和1两种结果,为0.所以a=p1==&m 等价与 a=0; 所以a输出结果为0,至于b上面说的很清楚,数据转换问题还有就是运算优先级搞懂就好说了 ,c语言跟数学一样,只不过稍微多了一些运算符,练得次数多了,就懂了
复制代码

作者: 星河鹭起    时间: 2014-4-19 16:19
a=p1==&m;
这个是运算优先级的问题,首先算p1==&m,然后再算a的赋值。
因为首先p1是指向k的地址,然后这里p1==&m,明显是不想等,所以p1==&m等于0,然后将0赋值给a
作者: 魅影穿眸    时间: 2014-4-23 18:56
楼主你看清楚,a=p1==&m;这一步实际是关系运算符的问题。p1==&m结果为假,所以算出的结果为0,然后再把0赋给a。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2