一道c语言题目,请问一下各位大神,以下四道程序各自允许结果是什么?为什么?谢谢le

glenshappy 2017-11-22 11:06:30
#include<stdio.h>
int main(void){
char t='a';
unsigned int b=3U;
printf("hello world\tlen:%u",sizeof(t)+b&(~b));
return 0;
}
~

===========================================================================
#include<stdio.h>
int main(void){
char t='a';
unsigned int b=3U;
printf("hello world\tlen:%u",sizeof(b)+b&(~b));
return 0;
}
~


===========================================================================
#include<stdio.h>
int main(void){
char t='a';
unsigned int b=3U;
printf("hello world\tlen:%u",b&(~b)+sizeof(t));
return 0;
}
~


===========================================================================
#include<stdio.h>
int main(void){
char t='a';
unsigned int b=3U;
printf("hello world\tlen:%u",b&(~b)+sizeof(b));
return 0;
}
~
...全文
257 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
glenshappy 2017-11-25
  • 打赏
  • 举报
回复
引用 7 楼 glenshappy 的回复:
[quote=引用 1 楼 paschen 的回复:] 依次是4 4 1 0 ~b的值为-4,b&(~b)的值为0 但要注意的是,+的优先级高于&,所以sizeof(t)+b&(~b)是先做+运算,再去做&运算
没大懂啊。。版主,先做+运算,结果为4,然后和-4做与运算,结果为0?不是说输出是4吗?[/quote] 想了一想,突然又懂了
glenshappy 2017-11-25
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
依次是4 4 1 0 ~b的值为-4,b&(~b)的值为0 但要注意的是,+的优先级高于&,所以sizeof(t)+b&(~b)是先做+运算,再去做&运算
没大懂啊。。版主,先做+运算,结果为4,然后和-4做与运算,结果为0?不是说输出是4吗?
glenshappy 2017-11-25
  • 打赏
  • 举报
回复
引用 3 楼 cfjtaishan 的回复:
[quote=引用 1 楼 paschen 的回复:] 依次是4 4 1 0 ~b的值为-4,b&(~b)的值为0 但要注意的是,+的优先级高于&,所以sizeof(t)+b&(~b)是先做+运算,再去做&运算
b是u32的,~b按位取反后,不会是-4,-4是有符号数; ~b按位取反后,是除第一和第二位位0,其他位(2~31位,从0开始)全位1;[/quote] 我试了一下,确实是的,~b的结果是0Xffff fffb十六进制对应的正整数。。
paschen 2017-11-23
  • 打赏
  • 举报
回复
依次是4 4 1 0 ~b的值为-4,b&(~b)的值为0 但要注意的是,+的优先级高于&,所以sizeof(t)+b&(~b)是先做+运算,再去做&运算
paschen 2017-11-23
  • 打赏
  • 举报
回复
引用 3 楼 cfjtaishan 的回复:
[quote=引用 1 楼 paschen 的回复:] 依次是4 4 1 0 ~b的值为-4,b&(~b)的值为0 但要注意的是,+的优先级高于&,所以sizeof(t)+b&(~b)是先做+运算,再去做&运算
b是u32的,~b按位取反后,不会是-4,-4是有符号数; ~b按位取反后,是除第一和第二位位0,其他位(2~31位,从0开始)全位1;[/quote] 数据在内存中实际是一样的,不必纠结于此,用有符号理解更容易
赵4老师 2017-11-23
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
自信男孩 2017-11-23
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
依次是4 4 1 0 ~b的值为-4,b&(~b)的值为0 但要注意的是,+的优先级高于&,所以sizeof(t)+b&(~b)是先做+运算,再去做&运算
b是u32的,~b按位取反后,不会是-4,-4是有符号数; ~b按位取反后,是除第一和第二位位0,其他位(2~31位,从0开始)全位1;
自信男孩 2017-11-23
  • 打赏
  • 举报
回复
建议每个程序都运行一遍,然后根据结果挨个分析。注意运算符的优先级;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧