给大家出几道有趣的题
在看书的途中经常会看到很多细节问题,我无聊到蛋疼给大家出几道题,看能不能激起你的兴趣啊~
三个问题,一个在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]的空间地址是有的,可以用,这样就预防了错误!
[解决办法]
[解决办法]
[解决办法]
第三题考的是 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);
这样才有意思嘛!