1.分析下列程序的输出
int main(int argc, char *argv[])
{
int t = 4;
printf("%lu\n", sizeof(t--));
printf("%lu\n", sizeof("ab c\nt\012\xa1*2"));
return 0;
}
sizeof(t--)计算int类型大小,输出为4;
ab c占4个字节,\n,\012,*,2,还有结束符占1个字节,\xal占2个字节;
2.下面代码会输出什么?
int main(int argc, char *argv[])
{
int a = 10, b = 20, c = 30;
printf("%d %d\n", b = b*c, c = c*2) ;
printf("%d\n", printf("%d ", a+b+c));
return 0;
}
printf函数的运行机制为在栈上申请存储空间, 规则为先进后出, 因此printf()表现为参数从右向左运算, 所以c=60,b=1200;
先输出a+b+c的值1270,在输出字符长度4;
3.下面代码使用正确吗?若正确,请说明代码的作用;若不正确,请指出错误并修改。
void get_str(char *ptr)
{
ptr = (char*)malloc(17);
strcpy(ptr, "Xiyou Linux Group");
}
int main(int argc, char *argv[])
{
char *str = NULL;
get_str(str);
printf("%s\n", str);
}
主函数str没有变化,因为被调函数没有返回值;应该给被调函数加 return ptr;
4.请解释下面代码的输出结果。
size_t q(size_t b)
{
return b;
}
size_t (*p(char *str))(size_t a)
{
printf("%s\n", str);
return q;
}
int main(int argc, char *argv[])
{
char str[] = "XiyouLinuxGroup";
printf("%lu\n", p(str)(strlen(str)));
return 0;
}
size_t (*p(char *str))(size_t a)是一个返回值为函数指针的函数,()的优先级比*高,所以p先与()结合,p(char *str)是含有字符型指针参数的函数,返回值是size_t (*)(size_t a),也就是一个指向函数的指针
5.static全局变量与普通的全局变量有什么区别?static局部变量与普通局部变量有什么区别?static函数与普通函数有什么区别?
1.static构成了静态的全局变量,静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效
2.static局部变量只被初始化一 次,下一次依据上一次结果值
3.static函数与普通函数作用域不同
6.下列程序分别输出的是数组中的第几个0?
int main()
{
int a[][2]={0,0,0,0,0,0,0,0};
for(int i=0;i<=2;i++)
{
printf("%d\n",a[i][i]);
}
return 0;
}
分别是第1个,第4个,第7个;
7.const关键字的作用是什么?下面的这几种定义有区别吗?
const char *p;
char const *p;
char *const p;
const char *const p;
const char *p; 不能通过这个指针改变变量的值,但是可以通过其他引用来改变变量的值
char const *p;常量指针的值不能改变,但这不意味着指针本身不能改变,常量指针可以指向其他的地址,
char *const p;指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向该地址的指针来修改
const char *const p;指向常量的常指针:指针指向的位置不能改变且也不能通过这个指针改变变量的值
8.说说#include<>和#include" "有什么区别?为什么需要使用#include?
#include< > 引用的是编译器的类库路径里面的头文件 引用自带的一些头文件
#include" " 引用的是你程序目录的相对路径中的头文件 引用自己写的一些头文件
9.说明下面程序的运行结果。
int main()
{
int a,b=2,c=5;
for(a=1;a<4;a++)
{
switch(a)
{
b=99;
case 2:
printf("c is %d\n",c);
break;
default:
printf("a is %d\n",a);
case 1:
printf("b is %d\n",b);
break;
}
}
return 0;
}
因为switch中case之上的语句被跳过,所以b=2;
10,下面的代码输出什么?为什么?
int main()
{
unsigned int a=10;
int b=-20;
if(a+b>0)
{
printf("a+b=%d\n",a+b);
}
else
{
printf("a=%d b=%d\n",a,b);
}
return 0;
}
输出a+b=-10;因为整型变量运算,有一个变量无符号,结果按无符号算;
11.以下程序运行结果是什么?
int main()
{
int nums[5]={2,4,6,8,10};
int *ptr=(int*)(&nums+1);
printf("%d %d\n",*(nums+1),*(ptr-1));
return 0;
}
结果为4 10;*(nums+1)指nums数组第2个元素,(&nums+1)是增加整一个数组的地址;
12.对比下面程序在Linux和Windows上的输出结果,并思考原因。
int main()
{
while(1)
{
fprintf(stdout, "Group ");
fprintf(stderr, "XiyouLinux");
getchar();
}
return 0;
}
Linux:XiyouLinuxGroup ---stderr不带缓冲,stdout带行缓冲--输出只有到换行的时候,才会输出到屏幕
Windows:Group XiyouLinux---window下stdout和stderr一样都是不缓存的