西邮Linux兴趣小组2017纳新试题总结

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一样都是不缓存的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值