单选题
1、第294题 (1.0分) 题号:165 下列定义数组的语句中正确的是()。
A
#define size 10 char str1[size],str2[size+2];
B
char str[];
C
int num['10'];
D
int n=5; int a[n][n+2];
答案解析
正确答案:A
解析:
这道题考查的是 C 语言中数组定义的基本规则。我们需要逐一分析每个选项,判断其是否符合 C 语言的语法规范(特别是关于数组大小必须是常量表达式的要求)。
**正确答案:A**
### 详细解析:
**1. 选项 A:`#define size 10 char str1[size],str2[size+2];`**
* **分析**:这是**正确**的。
* `#define size 10` 是预处理指令,它会将源代码中所有的 `size` 替换为 `10`。
* 在编译阶段,编译器看到的实际上是 `char str1[10], str2[10+2];`。
* `10` 和 `10+2`(即 12)都是整型常量表达式。在 C 语言中,定义数组时,方括号内的大小必须是一个**常量表达式**(Constant Expression)。宏定义产生的值被视为常量,因此这种定义方式是合法且标准的。
**2. 选项 B:`char str[];`**
* **分析**:这是**错误**的。
* 如果在定义数组时省略了数组长度(方括号为空),则必须在定义的同时进行**初始化**,以便编译器根据初始值的个数自动推断数组长度。
* 例如:`char str[] = "hello";` 是合法的。
* 但选项中只有声明 `char str[];` 而没有初始化,编译器无法确定需要分配多少内存空间,因此报错。
**3. 选项 C:`int num['10'];`**
* **分析**:这是**错误**的。
* 这里的 `'10'` 写法本身就有问题。在 C 语言中,单引号 `' '` 用于表示**字符常量**,且只能包含一个字符(或者转义字符)。`'10'` 包含了两个字符,这在标准 C 中是非法的多字符常量(Multi-character character constant),虽然某些编译器可能允许并给出警告,但其行为是实现定义的,且通常不是预期的整数 10。
* 即使假设意图是写数字 `10`,也不应加单引号。如果意图是字符 `'1'`,其 ASCII 码值为 49,虽然语法上 `int num[49]` 是合法的,但原题写法 `'10'` 是不规范的字符常量表示,通常被视为语法错误或严重警告,不属于“正确”的定义方式。更常见的错误陷阱是混淆字符串 `"10"` 和字符 `'1'` 或数字 `10`。
**4. 选项 D:`int n=5; int a[n][n+2];`**
* **分析**:在标准 C89/C90 中是**错误**的;在 C99 及以后标准中是合法的(变长数组 VLA),但在传统考试题境下通常视为错误。
* **传统 C 语言规则(C89)**:数组的大小必须是**编译时常量**。变量 `n` 是在运行时赋值的,不是编译时常量,因此不能用来定义数组大小。
* **C99 标准**:引入了变长数组(VLA),允许使用变量定义数组大小。但是,许多教材和考试题目基于经典的 C89 标准或为了考察“常量表达式”这一核心概念,通常将使用变量定义数组视为错误。
* **对比选项 A**:选项 A 使用宏定义,在任何 C 标准下都是绝对合法且安全的常量表达式用法。相比之下,D 选项依赖于特定的 C 标准版本,且在嵌入式或某些编译器设置下可能不被支持。因此,在单选题中,A 是无可争议的最佳答案。
### 总结:
* **核心考点**:C 语言数组定义时,数组长度必须是**常量表达式**。
* **宏定义 (`#define`)** 生成的标识符在预处理阶段被替换为字面量,属于常量表达式,符合要求。
* **变量**(如选项 D 中的 `n`)在传统 C 语言中不能作为数组长度。
* **未初始化的空数组**(如选项 B)是非法的。
因此,最符合规范且无歧义的正确选项是 **A**。
题目纠错
c语言选择判断题库
相关题目
单选题
1、〖第5题〗705) 若有语句int *point,a=4;和 point=&a;下面均代表地址的一组选项是()。
单选题
1、〖第4题〗700) 设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下
单选题
1、〖第3题〗90) 以下数据中,不正确的数值或字符常量是()。
单选题
1、〖第2题〗441) 下列语句中,不正确的是()。
单选题
1、〖第1题〗543) 若有int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则输出结果不为5
单选题
1、〖第20题〗96) 若有下列定义,则对a数组元素地址的正确引用是()。 int a[5],*p=a;
单选题
1、〖第19题〗13) 执行下列语句后变量x和y的值是()。y=10;x=y++;
单选题
1、〖第18题〗21) 以下不符合C语言语法的赋值语句是()。
单选题
1、〖第17题〗89) 以下标识符中,不能作为合法的C用户定义标识符的是()。
单选题
1、〖第16题〗202) 设有如下定义: struct sk {int a; float b;} data,*p;
