首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

给大家出几道有趣的题,该怎么处理

2012-03-28 
给大家出几道有趣的题在看书的途中经常会看到很多细节问题,我无聊到蛋疼给大家出几道题,看能不能激起你的

给大家出几道有趣的题
在看书的途中经常会看到很多细节问题,我无聊到蛋疼给大家出几道题,看能不能激起你的兴趣啊~
三个问题,一个在APUE中有,一个在C陷阱与缺陷中提到的,另外一个在C专家编程中说到过,但没有明示
问题一:

C/C++ code
#include <stdio.h>int main(){    printf("Hello,world\n");}

此代码在Intel x86架构下返回值总是12(可以用shell验证下),但我们并没有指定一个返回值,所以理论上返回值应该随机,这是怎么回事呢?

问题二:
C/C++ code
#include <stdio.h>int main(){    int i=0;    int arr[3];    int j=3;    while(i<=3){        arr[i]=9;        ++i;    }    printf("%d %d %d\n",arr[0]*j,arr[1]*j,arr[2]*j);    return 0;}

此段代码的输出是什么呢?知道为什么吗?

问题三:
C/C++ code
#include <stdio.h>//文件Aextern int* arr;int main(){    int* ptr=arr;    *arr=9;    printf("%d\n",*ptr);}

C/C++ code
//文件二int arr[2]={//在这里填空,0};

要想文件一的main输出9,在文件二中的注释处,该怎么给arr[0]赋值呢?

[解决办法]
关于第一个问题,我想是因为printf的返回值是12,他就作为函数的返回值了
第二个问题 27,27,27
第三个问题因为*arr=9;
[解决办法]
问题一:
返回值12,很有可能就是printf的返回值,因为它打印了12个字符。
x86下,int函数是用eax保存返回值。printf和main都是int,main返回的时候没有修改eax,就顺延下来了
[解决办法]
第二题要看是什么依赖于编译器对栈的处理,即使确定了x86结构,其结果仍然是不可预知的……
出得够****


唯一有意思的是第三题

C/C++ code
int arr[2]={&arr[0],4};
[解决办法]
第三题是有点意思,
在第一个文件里面a是数组,在第二个文件里面a是指针,这样就相当于a的第一个元素也就是a[0]成了a指针指向的内存地址(内容),如果要在第二个文件中使另外一个指针输出9,其实我觉得除了0不能赋给a[0]外,其他的都可以,因为0指针是个无效的地址指针!!但是为了不出现访问越界,或者说是防止出现访问程序以外的系统内存空间的危险,可以将数组a的第一个元素地址(首地址),或者第二个元素地址赋给a[0],因为毕竟a[2]的空间地址是有的,可以用,这样就预防了错误!
[解决办法]
探讨
在这个帖子里面,我们在讨论C

[解决办法]
探讨
引用:

第二题要看是什么依赖于编译器对栈的处理,即使确定了x86结构,其结果仍然是不可预知的……
出得够****


唯一有意思的是第三题

C/C++ code

int arr[2]={&amp;amp;arr[0],4};
nice!
不过(int)arr或者(int)(arr+1)才不会报错~

[解决办法]
第三题考的是 extern不一致的时候。

当cpp看到这个arr是个int * 就会像解释指针那样解释它。
int* ptr=arr; 
所以这个的意思是 把arr 的内容 给ptr

所以要ptr只向arr[0] 就要给ptr 的是地址。


[解决办法]
我觉得第二题出题不对应该是:
printf("%d %d %d\n",arr[i]*j,arr[2]*j,arr[3]*j);
这样才有意思嘛!

热点排行