1.在定义多维数组时,除了最左边的维度,其余的维度必须明确指定大小
2.int m[1][4]={4}; 定义的是一个 1 行 4 列的二维数组,初始化时提供了一个元素 4,其余元素默认初始化为 0,因此是正确的。
3.二维数组 a[3][6] 中的索引从 0 开始。也就是说,第一维度(行)的索引范围 是 0 到 2,第二维度(列)的索引范围是 0 到 5。
下面是该数组的索引结构:
a[0][0], a[0][1], a[0][2], a[0][3], a[0][4], a[0][5]
a[1][0], a[1][1], a[1][2], a[1][3], a[1][4], a[1][5]
a[2][0], a[2][1], a[2][2], a[2][3], a[2][4], a[2][5]
4.在C语言中,如果一个二维数组的部分元素没有显式初始化,未初始化的元素会自动被设为0。
5.在字符数组的定义和初始化过程中,双引号 " 和单引号 ' 所代表的含义和用法有所不同:
双引号 " 在字符数组中的用法:
双引号用于表示字符串常量。当你使用双引号来初始化一个字符数组时,它会自动包含字符串的所有字符,并在末尾添加一个空字符 \0 作为字符串的结束标志。
例如,char str[] = "Hello"; 会创建一个字符数组 str,其内容为 'H', 'e', 'l', 'l', 'o', '\0'。
单引号 ' 在字符数组中的用法:
单引号用于表示单个字符常量。如果你使用单引号来初始化一个字符数组,每个单引号中只能包含一个字符。
例如,char arr[] = {'H', 'e', 'l', 'l', 'o'}; 是一个有效的字符数组定义,但不会自动添加 \0。这意味着这个数组虽然包含了字符,但不符合 C 字符串的规范,因为缺少字符串结束标志。
6.char s1[10]; s1 = "Ctest";(×)
正确的方式:
①
char s1[10];
strcpy(s1, "Ctest");
②char s1[10] = "Ctest";
7.
getc()
该函数用于从输入流中获取一个字符,并不是用于读取整个字符串。
gets()
该函数可以读取一行输入,包括空格字符,直到遇到换行符为止。因此,它适用于从键盘读入含有空格字符的字符串。
getchar()
该函数一次读取一个字符,也不适合读取包含空格的整个字符串。
scanf()
该函数在遇到空格、制表符或换行符时会停止读取,因此不适合读取包含空格的整个字符串,除非使用特定的格式说明符来处理这一点(如使用 %[^\n])。
8.
\065 是一个八进制转义序列,表示字符 '5',占 1 个字符。
\xff 是一个十六进制转义序列,表示字符 ÿ,占 1 个字符。
9.标准的C语言标识符中不允许出现中划线(-),但是允许出现下划线(_)
10.
用户标识符可以包含字母(大小写均可)和数字。不能以数字开头,但可以包含数字。可以包含下划线 _,但不能以下划线开头。不可以使用C语言中的关键字(如 int, float, if, for等)作为用户标识符,保留字指的是标准中定义的一些特殊用途的标识符,例如 typedef, extern等,这些也不能用作用户标识符。
11.C语言中有逻辑类型 F
12.int a=b=0;是正确的定义语句。 F
13.假定x和y为double型,则表达式x=2,y=x+3/2的值是3.500000 F
14.C语言中不能用关系运算符比较字符串大小
15.要进行字符串内容的比较,应该使用 strcmp 或 strncmp 等字符串处理函数,而不是直接使用关系运算符。
16.
位运算符(&, |, ^, ~, <<, >>)和 求模运算符(%)是必须使用整型数据的运算符。在这些运算符中,操作数必须是整型类型,如 int、short、long 等。
17.
单目运算符 ++(自增)和 --(自减)用于对变量进行增减操作。它们的运算对象必须是变量
18.
用do-while语句构成的循环,在while后的表达式为零(假)时结束循环 F
19.goto 语句可以用于跳出循环
20.
假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是6 F(20)
21.若有定义:int a[2][3];对a数组元素正确引用的是a[2][3] F
22.
%d:以十进制整数形式输出变量 k 的值。
%o:以八进制形式输出变量 k 的值。
%x:以十六进制形式输出变量 k 的值(小写字母)。
23.
C语言中用于结构化程序设计的三种基本结构是顺序结构、选择结构、循环结构
24.strlen() 不会计算结尾的空字符 '\0',所以计算的长度确实是6
25.空字符 '\0' 的 ASCII 值是 0。
26.
a > b > c看起来很直观,但在C语言中,它不是像数学表达式那样工作。在C语言中,这个表达式会被解析为两个独立的比较操作:
a > b 会先计算,结果是 1(因为 5 > 4 为真)。
然后,将这个结果 1 与 c 比较: 1 > 3,结果是 0(因为 1 不大于 3)。
27.
28.
在C语言中,数组名在大多数表达式上下文中会被隐式地转换为指向其第一个元素的指针。这种转换叫做“数组到指针”的转换。具体来说,当数组名出现在表达式中并且不是作为&、sizeof或字符串初始化(例如字符数组)的操作数时,它就会转换为指向数组第一个元素的指针。
以下是一些常见的情形,在这些情形中数组名会隐式地转换为指向数组第一个元素的指针:
作为函数参数传递时:
void foo(int *p);
int main() {
int x[10];
foo(x);
}
在这里,x作为参数传递给函数foo时,它会被隐式地转换为指向x[0]的指针,即&x[0]。
在表达式中使用时:
int x[10];int *p = x;
在这里,x在赋值给指针p时,会被隐式地转换为指向x[0]的指针。
在算术运算中使用时:
int x[10];int *p = x + 1;
在这里,x在进行加法运算时,被隐式地转换为指向x[0]的指针,然后x + 1表示指向第二个元素的指针,即&x[1]。
间接访问数组元素时:
int x[10];int y = *x;
在这里,x在解引用操作*x中被隐式地转换为指向x[0]的指针,因此*x等价于x[0]。
简而言之,数组名在大多数表达式上下文中会自动转换为指向其第一个元素的指针,这是C语言的一种特性,用于方便处理数组和指针的关系。
29.冒泡
#include <stdio.h>
// 定义冒泡排序函数
void bubbleSort(int arr[], int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
// 如果当前元素大于后面的元素,则交换它们
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
int i;
printf("原始数组: \n");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
bubbleSort(arr, n);
printf("排序后的数组: \n");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
30.素数
#include <stdio.h>
int main()
{
int j;
printf("输入一个数: ");
scanf("%d", &j);
if (j <= 1) {
printf("%d 不是素数", j);
} else {
int i;
for (i = 2; i < j; i++) {
if (j % i == 0) {
printf("%d 不是素数", j);
break;
}
}
if (i == j) {
printf("%d 是素数", j);
}
}
return 0;
}