1.break是直接结束循环。
continue语句会跳过当前循环中的代码,开始下一次循环。
2.sizeof(a)=2*20=40
short int a[20];
sizeof(a)=
short int
(通常简称为short
)的数据类型大小是固定的,它至少占用16位(2字节)
sizeof()
是一个运算符,在C和C++等编程语言中用于确定一个变量或数据类型所占用的字节数。
3.模拟信号采集设备,ADC参考电压为5V,要求分辨率达到5mV,ADC至少应选择10位。
5V / 5mV = 1000,大概分成1000份。而2^10 = 1024 > 1000,10位正好够用
4.有函数定义:
void test(int a){}
void test(float a){}
则以下调用错误的是:test(0.5);0.5类型模糊,既匹配int类型也匹配float类型
test(‘c’);test(2+’d’);字符在C++中表示ASCII码,a=97,所以'c'=99,'d'=100
int类型:用于存储整数值,占用4个字节(32位)的内存空间。
有符号的int,
范围是-2^31~2^31-1
无符号的int,
范围是0~2^32-1
%d
是printf
函数中用于输出int
类型的格式说明符。
float类型:用于存储单精度浮点数,占用4个字节(32位)的内存空间。
取值范围是-3.4028235E38到+3.4028235E38。
%f
是printf
函数中用于输出float
类型的格式说明符。
5.c/c++前提下,下列关于构造函数说法正确的是(CD)
A.构造函数的返回值为void
B.构造函数不可以被重载
C.构造函数可以是内联函数
D.构造函数可以没有参数
构造函数是类的一种特殊成员函数,它在创建类的对象时自动调用,用于初始化对象的状态。构造函数的名字与类名相同,并且没有返回类型,甚至不能声明为 void
。构造函数的主要目的是为对象的成员变量设置初始值,或者执行一些必要的初始化操作。
构造函数有以下几个特点:
a.名称与类名相同:构造函数的名称必须与它所属的类名完全相同。
b.没有返回类型:构造函数不返回任何值,也不声明为 void
。
c.自动调用:当创建类的对象时,构造函数会自动被调用。
d.可重载:一个类可以有多个构造函数,只要它们的参数列表不同,这称为构造函数的重载。
e.默认构造函数:如果一个类没有显式定义任何构造函数,编译器会提供一个默认的无参构造函数,该构造函数不执行任何操作。
内联函数(Inline Function)是C++中一种特殊的函数,其目的是减少函数调用的开销。在编译时,编译器会将内联函数的代码直接插入到每次函数调用的地方,而不是像普通函数那样通过跳转到函数代码然后返回的方式进行调用。这种做法可以减少函数调用的开销,特别是对于小型、频繁调用的函数非常有效。
内联函数的定义通常在函数声明前加上 inline
关键字。
构造函数和析构函数:在C++中,构造函数和析构函数经常被声明为内联,因为它们通常包含小型且频繁调用的代码。
6、实参调用和形参声明的参数匹配。
7、预处理和宏
(1)预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置。
源文件的每一行只能有一条预处理命令,如果指令一行放不下,可以通过反斜杠“/”进行控制。
(2)宏名通常由大写字母表示,而非必须。
宏是在预编译期间进行的,将代码中的指定字符转换,转换结束后,再进行编译,所以不占用程序运行时间
8、int k, *p=&k; scanf("%d", &p);
int *p; scanf("%d", &p); P是指针型,scanf中&p应为整型变量空间的地址,而不是整型指针变量空间的地址
int k, *p; *p=&k; scanf("%d", &p);*p=&k 是把k的地址赋值给*p,*p相当于p所指向的变量。这里p没有被赋初值,也就没有指向任何变量,所以使用*p时出错。
9、下列程序的输出结果是(a=2,b=1)
int main() {
int x = 1, y = 0, a = 0, b = 0;
switch(x) {
case 1:
switch(y) {
case 0:
a++;
break;
case 1:
b++;
break;
}
case 2:
a++;
b++;
break;
case 3:
a++;
b++;
break;
}
printf("a=%d,b=%d\n", a, b);
}
case1:switch(y)内部break后a=1,b=0,但是外部没有break。 于是继续执行case2:a=2,b=1.break结束
10、重载函数
重载函数(Function Overloading)是C++中的一种特性,允许在同一个作用域内定义多个同名函数,只要它们的参数列表不同。参数列表可以是参数的类型不同、参数的数量不同,或者参数的顺序不同。编译器根据函数调用时提供的参数来决定调用哪个具体的函数。
重载函数中使用默认参数是允许的,但在调用函数时要小心出现如下二义性。 void foo(); void foo(int a=0); 在上述函数声明下,如果我们在程序中这样调用foo()函数时,就会出现二义性,此时无法通过编译阶段。
重载函数中编译时根据参数表进行选择
构造函数重载将会给初始化带来多种方式
不要使用重载函数来描述毫无相干的函数
11、下面哪些运算符不能被重载(ABC)
A、三目运算符“?:”
B、作用域运算符“::”
C、对象成员运算符“.”
D、指针成员运算符“->”
在C++中,大多数运算符都可以被重载,以允许它们在用户定义的类型(如类)上进行操作。然而,有一些运算符是不能被重载的。这些运算符包括:
(1)成员访问运算符" ."
和 ".*"
:用于访问类的成员和成员指针。
(2)作用域解析运算符 "::"
:用于指定类、命名空间或枚举类型的成员。
(3)条件运算符 "?:"
:这是一个三元运算符,用于条件表达式。
(4)sizeof运算符:用于获取对象或类型所占的字节数。
(5)类型转换运算符:如 static_cast
, dynamic_cast
, const_cast
, reinterpret_cast
。
12、自动变量
自动变量,只在定义它们的时候才创建,在定义它们的 函数 返回时系统回收变量所占 存储空间 。对这些变量 存储空间 的分配和回收是由系统自动完成的。一般情况下,不作专门说明的局部变量 ,均是自动变量。自动变量也可用关键字auto作出说明
与自动变量相对的是静态变量(Static Variable),静态变量在程序的整个执行期间都存在,并且在程序的多次执行中保持其值。静态变量需要使用static
关键字来声明。
register int i; 寄存器变量
13、C 语言中的文件类型只有
在C语言中,文件类型主要分为两种:
(1)文本文件(Text File):文本文件包含可读的字符,如ASCII字符。在C语言中,文本文件通常通过文件指针与标准I/O库函数(如fopen
, fprintf
, fscanf
, fclose
等)进行操作。
(2)二进制文件(Binary File):二进制文件包含的是二进制数据,即数据以原始形式存储,不经过任何编码转换。在C语言中,二进制文件同样通过文件指针与标准I/O库函数进行操作,但读写操作通常使用fread
和fwrite
等函数。
从文件编码的方式来看,文件可分为ASCII码文件(文本文件)和二进制文件两种。
14、运行后报错
#include <stdio.h>
main() {
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p = a + 5, *q = NULL;
*q = *(p+5);
printf("%d %d\n", *p, *q);
}
q
被初始化为 NULL
,即它不指向任何有效的内存地址。尝试通过 NULL
指针写入数据是未定义行为,并且在大多数情况下会导致程序崩溃。
因此,这段代码在尝试执行 *q = *(p+5);
时很可能会导致运行时错误。
最后,printf
语句尝试打印 *p
和 *q
的值。由于 *p
是有效的,它将打印出数组中第六个元素的值,即6。但是由于 *q
的操作是未定义的,打印 *q
的结果是不确定的,可能产生任何值,或者导致程序崩溃。
正确的做法是先确保 q
指向一个有效的内存地址,然后再进行解引用和赋值操作。例如,可以将 q
初始化为指向数组 a
的某个元素,或者动态分配内存给 q
。
15、是已知变量p、q是两个同类型的指针变量,下列表达式有语法错误的是(C)
A、p+1 指针p指向的地址的下一位置
B、q++ 改变指针变量q存储的地址值
C、(*p-q)/2 参与该运算的q所代表的含义不清晰
D、*p(*q) 指针变量p和q所指向的值之间的运算