2017题目总结

 2017
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\nt\012\xa12"是一个字符串,其中abct2和各占一个字节,空格占一个字节,\n,\012,\xa1分别是转义字符,8进制数,16进制数,各占一个字节,
字符串结束标志\0占一个字节,此字符串一共占11个字节。
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;
}

输出时先计算c=c2,此时c=60,然后计算b=bc,此时b=1200,所以输出为1200 60;第二行输出时先计算里面的a+b+c=1270,所以先输出1270 外面的printf输出的是里面的printf的返回值,即打印的字符个数,1270由4个字符组成,还有一个空格,所以printf的返回值是5。
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);
}

代码错误,应使用有返回值的函数返回申请的地址:

char * get_str(char *ptr)
{
ptr = (char*)malloc(17);
strcpy(ptr, "Xiyou Linux Group");
return ptr;
}
int main(int argc, char *argv[])
{
char *str = NULL;
str=get_str(str);
printf("%s\n", str);
}
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先与()结合,p(char *str)是含有字符型指针参数的函数,返回值是size_t (*)(size_t a),也就是一个指向函数的指针.该指针指向的函数有size_t类型的参数.

5.静态全局变量不能被其它文件所用;
其它文件中可以定义相同名字的变量,不会发生冲突;
6.

int main(int argc, char *argv[])
{
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;
}

输出的是第一个,第四个,第七个。
7.

const char *p;
char const *p;
char *const p;
const char *const p;

const的作用是定义静态变量,第一个和第二个均表示p所指向的内容不可修改,
第三个const修饰p表示p不可修改,而p所指向的内容可以修改,第四个表示p和p所指向的内容均不能修改。
8.#include表示将指定头文件嵌入源程序中,#include<>优先调用标准库函数中的文件,#include“”优先调用当前目录下的文件。
9.

int main(int argc, char *argv[])
{
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语句是选择结构,所以switch里面的b=99不会被执行,所以b仍然为2,而default语句后面没有break,所以当a=3时,会依次执行default后面的语句。
10.

int main(int argc, char *argv[])
{
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相加时会先将b转化为无符号数再与a相加,此时结果为为一个非常大的无符号数,即(a+b)>0,而输出时d%表示十进制有符号数,所以结果为-10。
11.

int main(int argc, char *argv[])
{
int nums[5] = {2, 4, 6, 8, 10};
int *ptr = (int *)(&nums+1);
printf("%d, %d\n", *(nums+1), *(ptr-1));
return 0;
}

(&nums+1)会对整个数组进行移动。
12.

int main(int argc, char *argv[])
{
while(1)
{
fprintf(stdout, "Group ");	
fprintf(stderr, "XiyouLinux");
getchar();
}
return 0;
}

Linux下输出 xiyouLinux Group
stdout 标准输出流,行缓冲,遇到换行符或者缓冲区满时才输出
stderr 标准错误流,直接输出到屏幕上
而在Windows下,stdout被设置不进行行缓冲,直接输出:
Group XiyouLiunx
13.

int main(int argc, char *argv[])
{
char str[512];
int i;
for (i = 0; i < 512; ++i)
{	
str[i] = -1 - i;
}
printf("%lu\n", strlen(str));
return 0;
}

255的二进制数为100…000100000000,char是一个字节,取后8位,即数组的第255个元素为0,所以输出为255。
15.防止在多平台编译下相互影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值