C语言小操练

1、下列那些操作是合法的

const char* p1 = "hello";
char* const p2 = "world";

A: p1++;
B: p1[2] = ‘w’;
C: p2[2] = ‘l’;
D: p2++;
首先,p1、p2均指向常量字符串,不可修改
根据 * 号和const的位置,左定值右定向,p2++不合法
所以选 A。

2、以下程序运行后的输出结果是( )

int main()
{
	int a = 1, b = 2, m = 0, n = 0, k;
	k = (n = b < a) && (m = a);
	printf("%d,%d,%d\n", k, m, n);
	return 0;
}

&& 左(n=b<a)= false,所以m=a并不会执行,
而 < 优先级高于 = 所以n=b,也不会执行。
故输出为0,0,0

3、以下程序的输出结果为()。

int main()
{
	int i = 010, j = 10;
	printf("%d,%d\n", ++i, j--);
	return 0;
}

从++i,j–得出 i 先自增再输出,j先输出再自减
010为八进制形式,010==8
所以输出为9,10

4、在32位机器上,下列代码中 sizeof(a) 的值是()

#pragma pack(2)

class A
{
	int i;
	union U
	{
		char buf[13];
		int i;
	}u;
	void foo() {};
	typedef char* (*f)(void*);
	enum
	{
		red,
		green,
		blue
	}color;
}a;

int i ---------4字节

union U:14字节
char buf[13] ----------------13字节,最小对齐数 1
int i ------------------------4字节,最小对齐数 2
所以共用体U的大小为13+1=14字节

void foo 函数定义 0字节
typedef 重命名 0字节
枚举类型color:4个字节
所以,sizeof(a)= 4+14+4 = 22

5、下面程序段中,for循环的执行次数是()。

int main()
{
	char* s = "\ta\018bc";
	for (; *s != '\0'; s++)  printf("*");
	return 0;
}

'\xxxxx’表示xxxx为八进制数,因为8不能为八进制数所以 \01与8断开
\t制表符,一次循环
a,两次
\01八进制1,三次
8,b,c,四次,五次,六次
for循环共执行6次。

6、对于int *pa[5] ;的描述,正确的是( )
A:pa是一个指向数组的指针,所指向的数组是5个int型元素
B:pa是一个指向某个数组第5个元素的指针,该元素是int型变量
C:pa[5]表示某个数组第5个元素的值
D:pa是一个具有5个元素的指针数组,每个元素是一个int型指针
int *pa[5] ,pa优先与[ ]结合,说明pa为数组,int * [5],表示共有5个元素,每个元素类型为int *

7、由多个源文件组成的C程序,经过编辑、预处理、编译、链接等阶段会生成最终的可执行程序。下面哪个阶段可以发现被调用的函数未定义?
A:预处理
B:编译
C:链接
D:执行

1.编辑:也就是编写C/C++程序。
2.预处理:相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。
3.编译:将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。
4.链接:通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。 链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个统一整体。在此过程中会发现被调用的函数未被定义。

8、请问该程序的输出是多少?

int main()
{
    unsigned char i = 7;
    int j = 0;
    for (; i > 0; i -= 3)
    {
        ++j;
    }
    printf("%d\n", j);
    return 0;
}

首先要注意到 i 为无符号数,其取值为0~255。
要想退出循环,i 必须为 0;
7 4 1------3次
254······2-------85次
255······3-------85次
3执行完后i==0,循环通知44停止,共173次

9、执行下面的程序时,假设用户输入为1□22□333,则ch1、ch2和ch3的值为()。

int main()
{
	char ch1, ch2, ch3;
	scanf("%1c%2c%3c", &ch1, &ch2, &ch3);
	printf("%1c-%2c-%3c", ch1, ch2, ch3);
	return 0;
}

输出字符时,scanf不会遇到空格或者’\0’就停止;在输出字符串时,scanf才会遇到空格或’\0’就停止;
所以ch1、ch2、ch3分别为‘1’,‘□’,‘2’。
%nc为打印几位字符,前面用‘ ’补全
所以printf的结果为 1-□□-□□2。

10、局部变量能否和全局变量重名?

int a = 10;
int main()
{
    int a = 9;
    cout << a << endl; //输出a等于9
    cout << ::a << endl;  //输出a等于10
    return 0;
}

能,局部会屏蔽全局。要用全局变量,需要使用"::"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值