面试时遇到的两个问题,不解,求救

weir75034 2009-02-26 04:37:56
1.设

int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr));

结果怎么会是:
8,8
*(ptr++)+=123后arr[]怎么会变为
arr[]={129,7,8,9,10};
难道*(ptr++)+=123相当于
*(ptr) += 123;
ptr++;
可以为什么*ptr,*(++ptr)又都是8呢???

2.定义:

union U
{
struct
{
unsigned int a:1;
unsigned int b:2;
unsigned int c:3;
} I;
char chr;
};

void main()
{
U u;
u.chr = 100;
printf("%d,%d,%d,",u.I.a,u.I.b,u.I.c);
}

结果是0,2,4呢????
...全文
309 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
weir75034 2009-03-02
  • 打赏
  • 举报
回复
谢谢,各位,明白了,结帖给分!!
yangch_nhcmo 2009-02-26
  • 打赏
  • 举报
回复
汗,上面划的线竟然对不齐
yangch_nhcmo 2009-02-26
  • 打赏
  • 举报
回复
第一题:

#include <stdio.h>
int main()
{
int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d\n",*ptr,*(++ptr));
/*
printf()从右往左运算,先执行*(++ptr)再执行*ptr,所以输入8,8
如果将上面改成 printf("%d,%d\n",*(++ptr),*ptr);
输出的结果为8,7
*/
for (int i = 0 ; i < 5 ; i++)
{
printf("%d\t",arr[i]);
}

return 0;
}
----------------------------
8,8
129 7 8 9 10

第二题考位域

#include <stdio.h>
union U
{
struct
{
unsigned int a:
1;
unsigned int b:
2;
unsigned int c:
3;
unsigned int d:
4;
} I;
char chr;
};

int main()
{
U u;
u.chr = 100;
printf("%d,%d,%d",u.I.a,u.I.b,u.I.c);
return 0;
}


01100100 //100的二进制
||||||
|||||-
|||--a
---b
c
tunnel115 2009-02-26
  • 打赏
  • 举报
回复
位域不懂啊
piginthetree 2009-02-26
  • 打赏
  • 举报
回复
考这种细节题, 真要命, 位域这些东西似乎平时根本用不到啊
chogimoga 2009-02-26
  • 打赏
  • 举报
回复
学习
xhy_851221 2009-02-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 pengzhixi 的回复:]
C/C++ code
union U
{
struct
{
unsigned int a:1;//位域 也就是说用1 bit来表示a
unsigned int b:2;
unsigned int c:3;
} I;
char chr;
};



sizeof(u)=max(sizeof(I),sizeof(chr))=1;
并且联合的内存是可以复用的,你给chr赋值100,他的二进制是0110 0100那么a占第1位也就是最右边低位0,所以他的值为0
b占2位也就是从右边第2位到第3位 10所以他的值为2,c从第4位起…

[/Quote]
sizeof(u)=max(sizeof(I),sizeof(chr))=sizeof(I)=4;
cattycat 2009-02-26
  • 打赏
  • 举报
回复
大家都说得不错了。
iamliadai 2009-02-26
  • 打赏
  • 举报
回复
int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;//没有序列点,行为未定义。谢谢。
printf("%d,%d",*ptr,*(++ptr));
guocai_yao 2009-02-26
  • 打赏
  • 举报
回复
貌似以前见过
dongpy 2009-02-26
  • 打赏
  • 举报
回复
printf("%d,%d",*ptr,*(++ptr));
=====================================
结果与函数调用时参数入栈顺序有关。

向下生长的堆栈模式,一般是从右向左入栈的(这样参数的地址在堆栈上是从左开始递增的),所以结果是8,8 。
  • 打赏
  • 举报
回复
int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr)); //关键在这里,++ptr最先操作,操作完后,输出的实际都是第3个元素。
pengzhixi 2009-02-26
  • 打赏
  • 举报
回复
日网速太慢了
pengzhixi 2009-02-26
  • 打赏
  • 举报
回复

union U
{
struct
{
unsigned int a:1;//位域 也就是说用1 bit来表示a
unsigned int b:2;
unsigned int c:3;
} I;
char chr;
};

sizeof(u)=max(sizeof(I),sizeof(chr))=1;
并且联合的内存是可以复用的,你给chr赋值100,他的二进制是0110 0100那么a占第1位也就是最右边低位0,所以他的值为0
b占2位也就是从右边第2位到第3位 10所以他的值为2,c从第4位起到第6为占3个位置也 就是100 所以他的值是4.
记住 结构I和chr是共享同一段内存就是了
pengzhixi 2009-02-26
  • 打赏
  • 举报
回复

union U
{
struct
{
unsigned int a:1;//位域 也就是说用1 bit来表示a
unsigned int b:2;
unsigned int c:3;
} I;
char chr;
};

sizeof(u)=max(sizeof(I),sizeof(chr))=1;
并且联合的内存是可以复用的,你给chr赋值100,他的二进制是0110 0100那么a占第1位也就是最右边低位0,所以他的值为0
b占2位也就是从右边第2位到第3位 10所以他的值为2,c从第4位起到第6为占3个位置也 就是100 所以他的值是4.
记住 结构I和chr是共享同一段内存就是了
pengzhixi 2009-02-26
  • 打赏
  • 举报
回复

union U
{
struct
{
unsigned int a:1;//位域 也就是说用1 bit来表示a
unsigned int b:2;
unsigned int c:3;
} I;
char chr;
};

sizeof(u)=max(sizeof(I),sizeof(chr))=1;
并且联合的内存是可以复用的,你给chr赋值100,他的二进制是0110 0100那么a占第1位也就是最右边低位0,所以他的值为0
b占2位也就是从右边第2位到第3位 10所以他的值为2,c从第4位起到第6为占3个位置也 就是100 所以他的值是4.
记住 结构I和chr是共享同一段内存就是了
waizqfor 2009-02-26
  • 打赏
  • 举报
回复
我的3L怎么没了? 555555555555
feng4206yu 2009-02-26
  • 打赏
  • 举报
回复
1.参数从右往左压栈...
2.

unsigned int a:1;

表示a占1个二进制位....
pengzhixi 2009-02-26
  • 打赏
  • 举报
回复

union U
{
struct
{
unsigned int a:1;//位域 也就是说用1 bit来表示a
unsigned int b:2;
unsigned int c:3;
} I;
char chr;
};

sizeof(u)=max(sizeof(I),sizeof(chr))=1;
并且联合的内存是可以复用的,你给chr赋值100,他的二进制是0110 0100那么a占第1位也就是最右边低位0,所以他的值为0
b占2位也就是从右边第2位到第3位 10所以他的值为2,c从第4位起到第6为占3个位置也 就是100 所以他的值是4.
记住 结构I和chr是共享同一段内存就是了
henry000 2009-02-26
  • 打赏
  • 举报
回复
int arr[]={6,7,8,9,10};
int *ptr=arr;
// 这里ptr指向第一个元素6
*(ptr++)+=123;
//将第一个元素加上123即123+6=129同时ptr++导致prt移动到下一个元素7
printf("%d,%d",*ptr,*(++ptr));
//由于printf函数的运算顺序是从右往左,prt=arr[1],(++ptr)=arr[2],ptr=arr[2]


加载更多回复(7)

69,336

社区成员

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

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