赞
踩
- 程序:一组计算机能识别和执行的指令
- 程序设计:创建程序的过程
- 语言简洁、紧凑,使用方便、灵活
- 运算符丰富
- 数据类型丰富
- 具有结构化的控制语句
- 语法限制不太严格,程序设计自由度大
- 能直接访问物理地址,能进行位操作
- 可移植性好
- 生成目标代码质量高,程序执行效率高
常量
整形常量
普通字符: ‘A’,以ASCII代码存储,‘A’ = 65, ‘a’ = 97
转义字符: 以 ‘’ 开头的字符序列:
转义字符 | 描述 |
---|---|
\a | 警报声,产生声音或视觉信号 |
\b | 退格符 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 水平制表符,用于对齐文本 |
\v | 垂直制表符 |
\\ | 反斜线字符 |
\' | 单引号字符 |
\" | 双引号字符 |
\? | 问号字符,用于避免与三元运算符混淆 |
\0 | 空字符(NULL字符),用于字符串的结束 |
\ooo | 八进制表示的字符(ooo代表八进制数) |
\xhh | 十六进制表示的字符(hh代表十六进制数) |
字符串常量:“BOY”,双撇号将诺干个字符括起来,字符串常量是双撇号中的全部字符,但不包括双撇号
符号常量:用 #define 指令,指定一个符号名称代表一个常量。如:#define PI 3.1416
变量
变量代表一个有名字的、具有特定属性的存储单元,用来存放数据,也就是变量的值,在程序运行期间,变量的值是可以改变的。
变量必须先定义,后使用,
定义时指定该变量的名字和类型,变量名实际上是以一个名字代表的存储地址,在对程序编译链接时有编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据
常变量
C99 运许使用常变量,在定义变量时,前面加一个关键字 const,如 const int a = 3
,且在变量存在期间其值不能改变
常变量与常量的异同?
常变量具有变量的基本属性,只是不允许改变其值,常变量是有名字的不变量,常量是没有名字的不变量
常变量与符号常量有什么不同?
常变量是有数据类型和内存地址的不可变变量,而符号常量是在编译之前就被替换掉的字符串,没有数据类型和内存地址。
标识符
字母
、数字
和 下划线
组成,且第一个字符必须是 字母或下划线
C语言中的数据类型主要有哪几类?
类型 | 子类型 | C语言表示 | 字节数 | 取值范围(Visual C++的安排) |
---|---|---|---|---|
基本类型 | 整形类型 | |||
基本整形 | int | 4 | -2,147,483,648 至 2,147,483,647 | |
无符号整形 | unsigned int | 4 | 0 至 4,294,967,295 | |
短整形 | short | 2 | -32,768 至 32,767 | |
无符号短整形 | unsigned short | 2 | 0 至 65,535 | |
长整型 | long | 4 | -2,147,483,648 至 2,147,483,647 | |
无符号长整型 | unsigned long | 4 | 0 至 4,294,967,295 | |
双长整形 | long long | 8 | -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 | |
无符号双长整形 | unsigned long long | 8 | 0 至 18,446,744,073,709,551,615 | |
字符型 | char | 1 | -128 至 127 或 0 至 255) | |
无符号字符型 | unsigned char | 1 | 0 至 255 | |
布尔型 | bool | 1 | 0 或 1 | |
浮点类型 | ||||
单精度浮点型 | float | 4 | 1.2E-38 至 3.4E+38 | |
双精度浮点型 | double | 8 | 2.3E-308 至 1.7E+308 | |
复数型浮点型 | float _Complex , double _Complex | 双倍于对应浮点型 | 依赖于对应浮点型 | |
派生类型 | 指针类型 | * | ||
数组类型 | [] | |||
结构体类型 | struct | |||
共用体类型 | union | |||
函数类型 | 函数声明 | |||
枚举类型 | enum | |||
空类型 | void |
向零取整: 5/3 = 1,-5/3 = - 1
% 运算符 要求 运算对象(即操作数) 为 整数,结果也是整数
自增、自减运算符
++i , 先++,再用 i
i++ , 先用 i, 再++
谁前先谁
优先级:
运算符的两种性质:优先级 和 结合性
隐式转换
所谓隐式类型转换是指不用用户干预,系统自动进行的类型转换。隐式类型转换分为两种情况:
1)运算时转换
内存小 –> 内存大
整型数据类型 –> 浮点数据类型
有符号 –> 无符号
int num1=12;
double num2=10.5;
num1+num2;
在上述代码中,由于double类型的取值范围大于int类型,将int类型的num1与double类型的num2相加时,系统会自动将num1的数据类型由int转换为double类型,从而保证数据的精度不会丢失。
2)赋值转换
在赋值类型不同时,即变量的数据类型与所赋值的数据类型不同,系统会将 “=” 右边的值转换为变量的数据类型再将值赋给变量,例如给一个int类型的变量赋值为浮点数,如:int a = 10.2;
以上代码将浮点数10.2赋值给int类型的变量a,编译器在赋值时会将10.2转换为int类型的10再赋值给a,a最终的结果为10。这种在赋值时发生的类型转换称为赋值转换。
显示转换(强制转换)
显式类型转换指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,其基本语法格式如下所示:
(类型名)(表达式)
int(x)%3
在上述格式中,类型名和表达式都需要用括号括起来,具体示例如下:
int x = 10;
float f = 1.2;
double d = 3.75;
x = (int)(f + d); //将f+d的结果强制转换为int类型,再赋值给变量x
f = (double)(x)+d; //将x强制转换为double类型,与d相加,再将结果赋值给f
printf
用于输出,其格式控制符包括:
printf
(格式控制,输出表列)%d
或 %i
:输出整数(十进制)。%u
:输出无符号整数(十进制)。%f
:输出浮点数(小数)。
%m.nf
m
表示字段的最小宽度。如果数值的位数少于 m
,则输出会在左侧用空格填充,以确保整个输出至少有 m
个字符宽。n
表示小数点后的数字位数。如果数值的小数部分位数多于 n
,则四舍五入到 n
位;如果少于 n
,则在右侧用零填充。%-m.nf
%-m.nf
的格式与 %m.nf
相同,但加了一个 -
符号,表示左对齐。m
,则额外的空格会添加到数值的右侧,而不是左侧。%lf
:输出双精度浮点数。%e
或 %E
:以科学计数法输出浮点数。%g
或 %G
:根据数值的大小,自动选择 %f
或 %e
。%x
或 %X
:以十六进制格式输出无符号整数(小写/大写)。%o
:输出无符号整数(八进制)。%c
:输出单个字符。%s
:输出字符串。%p
:输出指针的值(地址)。%%
:输出 %
符号本身。scanf
用于输入,其格式控制符包括:
scanf
(格式控制,地址表列)%d
:读取整数(十进制),%nd
n为读取位数,不足前面需补空格%u
:读取无符号整数(十进制)。%f
:读取浮点数。%lf
:读取双精度浮点数。%x
:读取十六进制整数。%o
:读取八进制整数。%c
:读取单个字符。%s
:读取字符串,直到遇到空白字符(如空格、制表符或换行符)。%[...]
:读取符合指定字符集的字符串。%n
:读取到目前为止输入字符的数量。%*
:跳过读取的输出。这些格式控制符可以与附加修饰符一起使用,以改变输出或输入的格式,如指定宽度、精度或用于 short
、long
类型的修饰符。
在使用这些函数时,需要确保传递的参数与格式控制符匹配,否则可能导致未定义行为。例如,使用 %d
读取或输出浮点数就是不正确的。
if ( 表达式 ) 语句1
else 语句2
swithc(表达式){
case 常量1 : 语句1
case 常量2 : 语句2
...
case 常量n : 语句n
default : 语句n+1
}
case 和 default 都是起 标号(label)作用,并不进行条件检查
default:
break:
!> 算术运算符 > 关系运算符 > && 和 || > 赋值运算符
1.什么是算术运算?什么是关系运?什么是逻辑运算?
算术运算:用于执行数学计算,如加(
+
)、减(-
)、乘(*
)、除(/
)和取模(%
)。
关系运算:用于比较两个值,包括等于(==
)、不等于(!=
)、大于(>
)、小于(<
)、大于等于(>=
)和小于等于(<=
)。
逻辑运算:用于组合条件判断,包括逻辑与(&&
)、逻辑或(||
)和逻辑非(!
)。
C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
对于逻辑表达式,若其值为“真”,则以 1 表示,若其值为“假”,则以 0 表示。但是在判断一个逻辑量的值时,系统会以 0 作为“假”,以 1
作为“真”。例如3 && 5
的值为“真”,系统给出3 && 5
的值为1。
while( 表达式 ) 语句
do
语句
while( 表达式 )
for( 表达式1 : 表达式2 : 表达式3 ) 语句
break语句与continue语句的区别
break
语句和 continue
语句在C语言中都用于控制循环结构,但它们的作用和用法有明显的区别:
break 语句:
break
用于立即退出当前的循环或 switch
语句。break
会导致程序跳出包含它的最内层的 while
、for
或 do-while
循环,继续执行循环之后的代码。continue 语句:
continue
用于跳过当前循环的剩余部分,直接开始下一次迭代。for
循环中,continue
会导致控制跳转到迭代表达式;在 while
和 do-while
循环中,控制跳转到循环的条件测试。总结来说,break
用于完全结束循环,而 continue
用于跳过当前迭代的剩余部分,继续执行后续的迭代。
类型说明符 数组名[常量表达式]
int a[10] = {0}
// 无参
类型名 函数名(){ //或(void)
函数体
}
// 有参
类型名 函数名(形式参数列表){
函数体
}
// 空函数
类型名 函数名(){
}
// 函数体包括 声明部分 和 语句部分
函数可以放在任何位置,如果放在主函数后,需要加一个函数声明
函数声明:
- 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。
- 具体是不是存在,无关紧要·
- 函数的声明一般出现在函数的使用之前·要满足先声明后使用,
- 函数的声明一般要放在头文件中的。
简答题:
- C语言的特点: 面向过程的模块化语言
- 模块的实现方法一一函数,具有特定功能而且相对独立的 程序块。
- C程序构成: 都有一个且仅有一个主函数main(),其他的函数由main直接或间接调用
- 使用函数机制的优点 : 1)程序简洁明晰: 2)代码重用性高; 3)有利于程序的阅读与维护; 4)编程效率高。
- 函数分类:
1) 从用户角度对函数分类
(1)标准函数一一库函数(2)自定义函数
2)从函数定义形式看函数分类
(1)带参函数 (2)无参函数
3)从函数返回值看函数分类
(1)有返回值函数 (2)无返回值函数
函数调用的三种形式:
(1)函数语句
例:printf(“C程序设计\n”);
(2)函数表达式
例:a =max(x,y)*2;
(3)函数作为实参
例:printf(”%d\n",max(x,y));
m=max(a,max(b,c));
函数的形参和实参具有以下特点:
(1)形参只在本函数内部有效,函数调用结束后,则不
能在别的函数中使用。
(2)实参可以是常量、变量、表达式、函数等,无论实
参是何种类型的量,在进行函数调用时,它们都必须具
有确定的值,以便把这些值传送给形参。因此应预先用
赋值、输入等方法使实参获得确定值;而形参只能是变
量。
(3)实参和形参在数量、类型、顺序上应严格一致,否
则会发生类型不匹配的错误。
数组元素作函数实参时,把实参的值传给形参,是 值传递 的方式。数据传递的方向是从实参到形参,单项传递
数组名作为函数参数时,实际上是将数组的首地址传递给函数,这是一种引用传递的方式。数据传递的方向仍然是从实参到形参,但传递的是内存地址而非值本身。在函数内部对数组的任何更改都会影响到原始数组
C语言中的库函数是一系列预先编写好的、可重用的函数,它们提供了执行各种常见任务的能力。这些函数被组织在标准库中,可以在不同的程序中使用。
标准输入输出库(stdio.h
)
printf
、scanf
、fgets
、fputs
、fopen
、fclose
等。标准库(stdlib.h
)
malloc
、free
、atoi
、rand
、exit
等。字符串处理库(string.h
)
strcpy
、strcat
、strlen
、strcmp
等。数学库(math.h
)
sin
、cos
、sqrt
、pow
等。字符处理库(ctype.h
)
isalpha
、isdigit
、tolower
、toupper
等。时间日期库(time.h
)
time
、localtime
、strftime
等。断言库(assert.h
)
assert
函数,用于测试假设和快速发现错误。C提供的预处理功能主要有以下三种:
这些功能分别用宏定义命令、文件包含命令、条件编译
命令来实现。为了与一般C语句相区别, 这些命令以
符号“ # “ 开头
定义:在函数内部或者复合语句内部声明的变量。
作用域:仅限于函数或复合语句内,离开该函数或复合语句后再使用这种变量是非法的。
生命周期:仅限于函数或复合语句的执行期间。
初始化:应在使用前初始化。
void function() {
int localVar = 5; // 局部变量
}
int globalVar; // 全局变量
void function() {
globalVar = 5;
}
C语言中,对于同名变量的处理应遵循下面的规则:
- 在同一个作用域内不允许出现同名变量的定义。
- 相互独立的两个作用域内的同名变量分配不同的存储单元,代表不同的变量,互不影响.
- 如果在一个作用域和其所包含的子作用域内出现同名变
量,则在子作用域中,内层变量有效,外层变量被屏蔽。
malloc
, calloc
, realloc
等函数进行内存分配。free
函数释放内存。int *arr = malloc(10 * sizeof(int)); // 动态分配内存
if (arr != NULL) {
// 使用 arr
}
free(arr); // 释放内存
int globalVar; // 全局变量
static int staticVar; // 静态变量
- 静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。
- 动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。
自动的(auto)
静态的(static)
寄存器的(register)
外部的(extern)
1.auto变量
函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。
关键字auto作存储类别的声明。 例如:
int f(int a)/*定义f函数,a为形参*/
/*定义b、c为自动变量*/
auto int b,c=3
定义:static 数据类型 内部变量表;
存储特点:
局部静态变量值具有可继承性
register 变量
register 建议编译器尝试将变量存储在CPU寄存器中,以便快速访问。但这只是一个提示,编译器可以忽略它。
extern声明外部变量
外部变量是在函数的外部定义的全局变量,它的作用域
是从变量的定义处开始,到本程序文件的末尾。在此作用域
内,全局变量可以为程序中各个函数所引用。编译时将外部
变量分配在静态存储区。
有时需要用extern来声明外部变量,以扩展外部变量的作
用城。
&a
是变量 a
的地址,也可称为变量 a
的指针。&
是取地址运算符,&a
是 a
的地址,也可以说,&
是取指针运算符。&a
是 a
的指针(即指向变量 a
的指针)。#include <stdio.h>
int main() {
int a = 10; // 定义一个整型变量a
int *ptr = &a; // 定义一个指针变量ptr,指向变量a的地址
printf("The value of a is %d\n", a);
printf("The address of a is %p\n", (void*)&a);
printf("The value of ptr (the pointer to a) is %p\n", (void*)ptr);
printf("The value pointed by ptr is %d\n", *ptr);
int arr[] = {1, 2, 3}; // 定义一个整型数组
printf("The address of the first element of arr is %p\n", (void*)arr);
printf("The first element of arr is %d\n", *arr);
return 0;
}
// 输出
The value of a is 10
The address of a is 0x956f60
The value of ptr (the pointer to a) is 0x956f60
The value pointed by ptr is 10
The address of the first element of arr is 0x956e40
The first element of arr is 1
变量定义 | 类型表示 | 含义 |
---|---|---|
int i; | int | 定义整型变量i |
int *p; | int * | 定义p为指向整型数据的指针变量 |
int a[5]; | int[5] | 定义整型数组a,它有5个元素 |
int *p[4]; | int *[4] | 定义指针数组p,它由4个指向整型数据的指针元素组成 |
int (*p)[4]; | int (*)[4] | p为指向包含4个元素的一维数组的指针变量 |
int f(); | int() | f为返回整型函数值的函数 |
int *p(); | int*() | p为返回一个指针的函数,该指针指向整型数据 |
int (*p)(); | int(*)() | p为指向函数的指针,该函数返回一个整型值 |
int **p; | int ** | p是一个指针变量,它指向一个指向整型数据的指针变量 |
void *p; | void * | p是一个指针变量,基类型为void(空类型),不指向具体的对象 |
结构体是C语言中一种允许用户自定义数据类型的机制。它可以用来存储不同类型的数据项。例如,一个结构体可以包含
int
、float
和char
类型的成员。结构体可以将多个不同类型的数据项组合成一个单一的单位。这在处理复杂数据时非常有用,比如当你需要一种类型来表示一个人的信息(包含姓名、年龄、身高等)时。
结构体通过 struct
关键字定义。结构体的定义包括结构体的名称和一系列成员(可以是不同类型的变量)。
// 一般形式
struct 结构体名{
成员列表
}
struct Person {
char name[50];
int age;
float height;
};
在这个例子中,Person
是结构体的名称,包含一个字符串 name
、一个整数 age
和一个浮点数 height
。
一旦定义了结构体,就可以声明该类型的变量。
struct Person person1;
可以使用点号(.
)操作符来访问结构体的成员。
person1.age = 30;
strcpy(person1.name, "Alice");
person1.height = 5.5;
也可以创建指向结构体的指针,并使用箭头(->
)操作符来访问结构体成员。
struct Person *ptr;
ptr = &person1;
ptr->age = 30;
结构体可以作为函数的参数传递。可以传递结构体本身(这将会复制整个结构体)或结构体的指针。
就像基本数据类型一样,可以创建结构体的数组。
结构体可以包含其他结构体作为成员,这称为嵌套结构体。
使用 typedef
可以为结构体定义一个新的名称,简化代码。
typedef struct Person Person;
Person person1;
结构体在C语言中的应用非常广泛,它们是实现抽象数据类型(ADT)和组织复杂数据的强大工具。
共用体和结构体类似,但所有的成员共享同一块内存空间。这意味着在同一时间内,只能有效地使用其中一个成员。共用体的使用常常与特定类型的存储或转换有关。共用体(Unions)在C语言中是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。在共用体中定义的所有成员共享同一块内存空间,这意味着任何一个成员的修改都会影响到其他成员。共用体的大小等于其最大成员的大小。
使用 union
关键字来定义共用体。例如:
union Data {
int i;
float f;
char str[20];
};
在这个例子中,Data
是一个共用体,包含一个整数、一个浮点数和一个字符数组。
可以声明共用体变量,并给其中的成员赋值。但需注意,同一时间只能有效使用一个成员。
union Data data;
data.i = 10;
data.f = 220.5; // 此时i的值被覆盖
strcpy(data.str, "C Programming"); // 此时f的值被覆盖
枚举类型是一种用户定义的数据类型,它允许为整数值指定更易读的符号名称,从而提高程序的可读性和可维护性。
使用 enum
关键字定义枚举。例如:
enum Color {RED, GREEN, BLUE};
在这个例子中,Color
是一个枚举类型,包含三个值:RED、GREEN和BLUE。
可以声明枚举类型的变量:
enum Color favoriteColor;
favoriteColor = RED;
typedef
用于为已有的数据类型创建一个新名称,从而提高代码的可读性和易于理解。
例如,可以为指针类型创建新的名称:
typedef int* intPtr;
intPtr ptr1, ptr2;
或者为结构体定义一个新名称:
typedef struct Person {
char name[50];
int age;
} Person;
Person person1;
在计算机程序设计中,文件是一种用来永久存储数据的资源。文件存储在某种永久性存储设备上(如硬盘),它允许数据的存储和检索,这与内存中的临时数据存储形成对比。文件可用于存储各种类型的数据,如文本、图像、音频、视频等。
.txt
文件。它们通常可读并可由文本编辑器打开。fopen
函数来打开一个文件。这个函数返回一个 FILE
类型的指针,如果文件无法打开,则返回 NULL
。FILE *fp;
fp = fopen("file.txt", "r"); // "r" 表示以只读方式打开文件
fclose
函数来关闭一个打开的文件,释放资源。fclose(fp);
fprintf
函数用于向文本文件写入数据,而 fwrite
用于向二进制文件写入数据。fscanf
函数用于从文本文件读取数据,而 fread
用于从二进制文件读取数据。fseek
函数用于在文件内移动文件指针到指定位置。printf
、scanf
)。标准输入输出是特殊的文件流,分别指向标准输入设备(通常是键盘)和标准输出设备(通常是屏幕)。void bubbleSort(int arr[], int n) {
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-i-1; j++)
if (arr[j] > arr[j+1])
swap(&arr[j], &arr[j+1]);
}
void selectionSort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = i+1; j < n; j++) {
if (arr[j] < arr[i]) {
swap(&arr[i], &arr[j]);
}
}
}
}
void insertionSort(int arr[], int n) {
int i, key, j;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
-1和1 循环的项 如:编程计算sum =1-1/3+1/5-1/7+1/9……
使用 int sign = 1;
sign *= -1;
(注意这里除数要使用浮点型)
判断闰年
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return 1;
逆序(回文)
使用两个指针i,j i=0,j=n-1(n为长度),当i<j时,交换i,j的值
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。