1、在上下文和头文件正常的情况下,以下代码输出的值是:
1
2
3
4
5
6
7
8
9
10
11
12
13
int
x = 4;
void
incre() {
static
int
x = 1;
x *= x + 1;
printf
(
"%d"
, x);
}
int
_tmain(
int
argc, _TCHAR *argv[]) {
int
i;
for
(i = 1; i < x; i++) {
incre();
}
return
0;
}
A、2642
B、2
C、4
D、5
答案:A
解析:题目中定义了一个全局变量int x=4,那么在主函数中的循环会执行3次(调用三次incre函数)。在incre函数中,又定义了一个x,这个x被static修饰延长了局部变量的生命周期,那么下次再调用这个函数时,这个局部变量x不会再被初始化,会保留上次调用结束后的值。第一次x = x *(x+1)= 1 * 2 = 2,第二次x = x *(x+1)= 2 * 3 = 6,第三次x = x *(x+1)= 6 * 7 = 42。所以最后的结果为2642,选择选项A。
在看题友讨论中,发现有如下疑问,在这里解释一下。
主函数中的循环表达式2中的x不会随着incre函数中x的变化而变化吗?incre函数中的x是一个局部变量,它的作用域是incre函数的函数体内。被static修饰延长的是生命周期而不是作用域,这是两个不同的概念。
整个代码中有两个变量x,那么在incre函数内部x的值究竟应该等于哪个?在一个函数中,同名的局部变量的值会将全局变量的值覆盖掉,所以函数内部的变量值应该与局部变量的值一致。
2、 若有定义:char s[3][4];
则下列对数组元素s[i][j]的各种引用形式中,正确的是()
A、* (s+i)[j]
B、* (&s[0][0]+4 * i+j)
C、* ((s+i)+j)
D、* ( * (s+i)[j])
答案:B
解析:要对数组的元素进行引用,那么CD首先被排除。对于选项A,()的优先级最高,计算(s+i)结束后由于[ ]的优先级高于*,(s+i)会先与[ ]结合,选项A错误,正确的写法是(*(s+i))[j]。选项B中主要的思想是利用地址的偏移,偏移到目标地址后取*,B正确。
3、 在c语言中,下面能正确进行字符串赋值操作的是()
A、char s[5]={"ABCDE"};
B、char s[5]={‘A’,‘B’,’C’,’D’,’E’};
C、char *s; s="ABCDE";
D、char *s; scanf("%s",s);
答案:C
解析:选项A中字符串"ABCDE"末尾还有一个'\0',但是字符数组大小为5,选项A错误。选项B中赋值了五个字符,但是字符串以'\0'结尾,故选项B只是一个字符数组,但不是一个字符串,选项B错误。选项C和选项D都涉及到了野指针(没有指向的指针),对于一个野指针可以给它一个指向,但是不可以直接用其指向的地址,因为计算机随机赋的地址是不安全的,故选项D错误,选项C正确。
4、 C语言中,执行如下程序代码
1
2
3
4
char
chr = 127;
int
sum = 200;
chr += 1;
sum += chr;
后,sum的值是()
A、72
B、99
C、328
D、327
答案:A
解析:C语言中,char占一个字节,有符号char的范围是-128~127。所以本题代码中第三行进行加一操作后,会发生溢出(1000 0000),计算机默认数据是有符号的(1000 0000的补码为1 1000 0000),所以加一后的值为-128,最后的结果为72,选择选项A。
5、 下面选项中关于编译预处理的叙述正确的是()
A、预处理命令行必须使用分号结尾
B、凡是以#号开头的行,都被称为编译预处理命令行
C、预处理命令行不能出现在程序的最后一行
D、预处理命令行的作用域是到最近的函数结束处
答案:B
解析:预处理命令不是语句,不能以分号结尾,选项A错误。预处理命令行可以出现在程序的非代码行,可以是最后一行,选项C错误。预处理命令的作用域是从定义开始到整个文件结尾,选项D错误。
6、 在C语言中(以16位PC为例),5种基本数据类型的存储空间长度的排列顺序为()
A、char<int<long int<=float<double
B、char=int<long int<=float<double
C、char<int<long int=float=double
D、char=int=long int<=float<double
答案:A
解析:由下表,选择选项A。
类型 16位平台 32位平台 64位平台
char 1个字节 1个字节 1个字节 short 2个字节 2个字节 2个字节 int 2个字节 4个字节 4个字节 unsigned int 2个字节 4个字节 4个字节 float 4个字节 4个字节 4个字节 double 8个字节 8个字节 8个字节 long 4个字节 4个字节 8个字节 unsigned long 4个字节 4个字节 8个字节 long long 8个字节 8个字节 8个字节 指针 2个字节 4个字节 8个字节
7、 以下不能对一维数组 a 进行正确初始化的语句是()
A、int a[10] = {0, 0, 0, 0, 0};
B、int a[10] = { };
C、int a[] = {0};
D、int a[10] = {10*a};
答案:D
解析:A选项正确,这是数组的局部初始化,后面五个元素会自动补0。B选项正确,编译器自动将所有元素置零。C选项正确,这是数组的省略初始化,省略的是元素个数,赋几个值就开辟几个值的空间。D选项错误,a是一个数组名,这种写法是非法的。
8、 关于按值传递参数,下列说法中错误的是:
A、按值传递时,实参的值传递给形参,形参发生变化时不会影响实参。
B、实参的个数、类型应与形参一致。
C、定义函数时,会给形参分配存储单元。
D、实参与形参可以同名,此时两者会被分配不同的存储单元。
答案:C
解析:形参和实参是不同的存储单元,所以当按值传递时,形参的变化不会影响实参。定义函数时,不会给形参分配存储单元,只有调用时才会分配。故本题选择选项C。
9、 下面程序段的输出结果是( )。
1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
void
fun(
int
px,
int
pa,
int
*pb){
*pb = pa + px;
pa = *pb + px;
}
int
main(){
int
x = 4, a = 2, b = 2;
fun(x, a, &b);
printf
(
"%d,%d"
, a, b);
}
A、2, 2
B、2, 6
C、6, 2
D、6, 6
答案:B
解析:本题中有两种参数传递方式:值传递和地址传递。本题中实参a的传递方式是值传递,在被调函数中的形参会另外开辟空间,所以在被调函数中对应形参的操作不影响实参的值。变量b传递的是地址,那么被调函数中可以对变量b的值进行修改。故选择选项B。
标签:练习题,选项,12,字节,形参,int,char,牛客,函数 From: https://blog.csdn.net/a921876874/article/details/14320346510、假设数原型和变量说明如下:
void f4(int **p); int a[4]={1,2,3,4}; int b[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int *q[3]={b[0],b[1],b[2]};下面调用合法的是()
A、f4(a);
B、f4(b);
C、f4(q);
D、f4(&a);
答案:C
解析:本题主要是要分析每个选项中参数的类型与函数声明的形参类型是否一致。a的类型为int *,b的类型为int (*)[4],q的类型为int **,&a的类型为int (*)[4]。故选择选项C。