A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Dmajor 中级黑马   /  2014-4-19 10:31  /  1205 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

5 个回复

倒序浏览
分析内容在程序中给出
  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

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报 1 0
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);
}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
  1. 运算符优先级:  乘、除、求余*   /  %加、减 < <=  >  >=        小于、大于、小于等于、大于等于        = =   !=        等于、不等于//左边的依次大于右边的
  2. a=p1==&m 所以相当于先计算p1==&m &符号表示取该数据的内存地址,显然p1指向的k地址,与m地址不同 ,而c语言的布尔运算只有0和1两种结果,为0.所以a=p1==&m 等价与 a=0; 所以a输出结果为0,至于b上面说的很清楚,数据转换问题还有就是运算优先级搞懂就好说了 ,c语言跟数学一样,只不过稍微多了一些运算符,练得次数多了,就懂了
复制代码
回复 使用道具 举报
a=p1==&m;
这个是运算优先级的问题,首先算p1==&m,然后再算a的赋值。
因为首先p1是指向k的地址,然后这里p1==&m,明显是不想等,所以p1==&m等于0,然后将0赋值给a
回复 使用道具 举报
楼主你看清楚,a=p1==&m;这一步实际是关系运算符的问题。p1==&m结果为假,所以算出的结果为0,然后再把0赋给a。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马