C语言入门教程
第一个C程序
#include<stdio.h>// 包含标准输入输出库的头文件(提供printf函数)int main() { // 程序入口点,每个C程序必须有且只有一个main函数printf("Hello, World!\n"); // 打印输出到控制台,\n表示换行return 0; // 向操作系统返回0,表示程序正常结束
}
C语言基础语法
注释
用于解释代码,编译器会忽略。
// 单行注释
/* 这是多行注释 */
变量
C语言基础知识--变量_c语言变量-CSDN博客
用于存储数据的内存位置。使用前需要声明其类型和名称。
-
声明语法:
数据类型 变量名;
或数据类型 变量名 = 初始值;
-
基本数据类型:
-
int
: 整数 (如:42
,-10
) -
float
: 单精度浮点数 (如:3.14f
,-0.001f
) (注意f
后缀) -
double
: 双精度浮点数 (如:3.1415926535
,-2.71828
) (精度更高) -
char
: 单个字符 (如:'A'
,'$'
,'\n'
(换行符))。用单引号包围。 -
_Bool
(C99): 布尔值 (true
或false
, 通常用1
和0
表示)。需要包含stdbool.h
才能直接使用bool
,true
,false
。
-
int age = 25; // 声明一个整数变量age并初始化为25
float pi = 3.14159f; // 声明一个单精度浮点数变量pi
char grade = 'A'; // 声明一个字符变量grade
double salary; // 声明一个双精度浮点数变量salary(未初始化)
salary = 50000.75; // 给salary赋值
常量
C语言常量-CSDN博客
值在程序运行期间不能被改变的量。
-
使用
const
关键字:const 数据类型 常量名 = 值;
-
使用
#define
预处理指令:#define 常量名 值
(通常在文件开头)
const int DAYS_IN_WEEK = 7;
#define PI 3.1415926535
输入/输出(I/O)
C语言-----输入和输出_c语言输入输出-CSDN博客
printf()
格式化输出到标准输出(通常是屏幕)。需要 #include<stdio.h>。
-
格式控制字符串: 包含要打印的文本和格式说明符 (
%d
,%f
,%c
,%s
等)。
int num = 10;
float fnum = 3.14f;
char letter = 'X';
printf("Integer: %d\n", num); // 输出: Integer: 10
printf("Float: %.2f\n", fnum); // 输出: Float: 3.14 (%.2f保留两位小数)
printf("Character: %c\n", letter); // 输出: Character: X
printf("Combined: Num=%d, Float=%f\n", num, fnum);
scanf()
从标准输入(通常是键盘)格式化输入。需要 #include
<stdio.h>。
-
格式控制字符串: 指定要读取的数据类型及其格式说明符 (
%d
,%f
,%c
,%s
等)。 -
传递变量地址: 使用
&
运算符获取变量的内存地址。
int age;
float height;
printf("Enter your age and height (e.g., 30 1.75): ");
scanf("%d %f", &age, &height); // 注意 & 符号
printf("You are %d years old and %.2f meters tall.\n", age, height);
运算符
C语言的运算符(一眼详解)_c语言运算符-CSDN博客
-
算术运算符:
+
(加),-
(减),*
(乘),/
(除),%
(取模/求余数),++
(自增),--
(自减)-
5 / 2
结果是2
(整数除法),5.0 / 2.0
结果是2.5
。 -
10 % 3
结果是1
。 -
int a = 5; a++;
后a
变为6
。
-
-
关系运算符:
==
(等于),!=
(不等于),>
(大于),<
(小于),>=
(大于等于),<=
(小于等于)。计算结果为1
(真) 或0
(假)。 -
逻辑运算符:
&&
(逻辑与),||
(逻辑或),!
(逻辑非)。操作数通常是关系表达式的结果。 -
赋值运算符:
=
(赋值),+=
(加后赋值),-=
(减后赋值),*=
(乘后赋值),/=
(除后赋值),%=
(取模后赋值)。-
a += 3;
等价于a = a + 3;
-
-
位运算符(了解):
&
(按位与),|
(按位或),^
(按位异或),~
(按位取反),<<
(左移),>>
(右移)。直接操作二进制位。 -
其他运算符:
sizeof()
(求数据类型或变量占用的内存字节数),&
(取地址运算符),*
(指针运算符/解引用),?:
(三元条件运算符)。 -
运算符优先级和结合性: 决定了复杂表达式中运算的先后顺序。不确定时多用括号
()
明确优先级。
控制流程
条件语句 (if
, else if
, else
)
C语言条件判断语句:if、else if、else-CSDN博客
int score = 85;
if (score >= 90) {printf("Grade: A\n");
} else if (score >= 80) {printf("Grade: B\n"); // 这个会被执行
} else if (score >= 70) {printf("Grade: C\n");
} else {printf("Grade: F\n");
}
switch
语句
根据表达式的值选择不同的代码块执行。
C语言:流程控制之switch语句 _c语言 switch-CSDN博客
重要: 每个 case
后面通常要加 break;
,否则会继续执行下一个 case
的代码(称为“贯穿”)。
char grade = 'B';
switch (grade) {case 'A':printf("Excellent!\n");break; // 跳出switchcase 'B':printf("Good!\n"); // 这个会被执行break;case 'C':printf("Pass\n");break;case 'F':printf("Fail\n");break;default: // 可选,处理未列出的情况printf("Invalid grade\n");
}
while
循环
先判断条件,条件为真则执行循环体。
【C语言】循环语句_while循环语句用法-CSDN博客
int count = 0;
while (count < 5) {printf("Count: %d\n", count);count++; // 改变循环变量,避免死循环
}
do...while
循环
先执行一次循环体,再判断条件。循环体至少执行一次。
C语言初识(11) | do...while循环初识_do while-CSDN博客
int num;
do {printf("Enter a positive number: ");scanf("%d", &num);
} while (num <= 0);
for
循环
结构清晰,常用于已知循环次数的情况。
玩转C语言for循环语句_c语言for循环语句用法-CSDN博客
for (int i = 0; i < 5; i++) { // 初始化; 循环条件; 更新表达式printf("i is: %d\n", i);
}
// 输出: i is: 0, i is: 1, ..., i is: 4
跳转语句
-
break;
: 立即跳出当前所在的switch
或最内层循环 (while
,do...while
,for
)。 -
continue;
: 跳过当前循环的剩余语句,直接进入下一次循环的条件判断。 -
return;
: 退出当前函数。在main
函数中return 0;
表示程序正常结束。
函数
将代码组织成可重用的模块。提高代码可读性、可维护性和复用性。
C语言基础:函数(详详解)_c语言函数详解-CSDN博客
函数定义
// 函数定义
// 返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ...) {
// 函数体 (执行的代码)
// return [返回值]; // 如果返回值类型不是void,必须有return语句
// }
int add(int a, int b) { // 定义一个名为add的函数,接受两个int参数,返回一个int值int sum = a + b;return sum; // 返回计算结果// return a + b; // 更简洁的写法
}
函数声明 (原型): 告诉编译器函数的存在、名称、参数和返回值类型。通常在文件开头或头文件(.h
)中。定义本身也可以作为声明。
int add(int a, int b); // 函数声明(原型)
函数调用
int main() {int x = 5, y = 3;int result = add(x, y); // 调用add函数,传递x和y的值(实参)printf("Sum: %d\n", result); // 输出: Sum: 8return 0;
}
参数传递: C语言默认是值传递 (Pass by Value)。函数内部操作的是实参的副本,修改副本不会影响调用处的原始实参。如果要修改实参本身,需要使用指针。
void
类型
作为返回值类型:表示函数不返回任何值。
void greet(char name[]) {printf("Hello, %s!\n", name);
}
作为参数:表示函数不接受任何参数。int main(void) { ... }
是标准写法,表示 main
函数不接受参数。
指针
【C语言进阶】指针详解_c语言指针-CSDN博客
-
指针是一个变量,其值是另一个变量的内存地址。
-
声明指针:
数据类型 *指针变量名;
-
int *ptr;
// 声明一个指向整型(int)数据的指针变量ptr
-
-
取地址运算符
&
: 获取一个变量的内存地址。
int num = 42;
int *ptr; // 声明指针
ptr = # // 将num的地址赋值给指针ptr。现在ptr"指向"num。
解引用运算符 *
: 访问指针所指向的内存地址中存储的值。
printf("Value of num: %d\n", num); // 直接访问: 42
printf("Address of num: %p\n", &num); // 输出num的地址 (例如: 0x7ffd...)
printf("Value stored in ptr (address of num): %p\n", ptr); // 输出ptr的值(即&num)
printf("Value pointed to by ptr: %d\n", *ptr); // 通过ptr访问num的值: 42 (解引用)
*ptr = 100; // 通过指针修改num的值
printf("Now num is: %d\n", num); // 输出: 100
指针与函数 (模拟引用传递): 通过传递指针,函数可以修改调用处变量的值。
void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}
int main() {int x = 10, y = 20;printf("Before swap: x=%d, y=%d\n", x, y); // 10, 20swap(&x, &y); // 传递x和y的地址printf("After swap: x=%d, y=%d\n", x, y); // 20, 10return 0;
}
指针与数组: 数组名在大多数情况下可以被视为指向数组第一个元素的常量指针。
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // ptr指向arr[0] (等价于 ptr = &arr[0])
printf("First element: %d\n", *ptr); // 1
printf("Second element: %d\n", *(ptr + 1)); // 2 (指针算术: ptr+1指向下一个int的位置)
printf("Third element: %d\n", ptr[2]); // 3 (数组下标访问等同于指针运算)
遍历数组常用指针
for (int *p = arr; p < arr + 5; p++) {printf("%d ", *p);
}
简单示例:计算器
#include<stdio.h>// 函数声明
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
float divide(int a, int b); // 除法结果可能是小数int main() {int num1, num2;char op;printf("Enter first number: ");scanf("%d", &num1);printf("Enter operator (+, -, *, /): ");scanf(" %c", &op); // 注意%c前的空格,用于跳过之前的换行符printf("Enter second number: ");scanf("%d", &num2);int result_int;float result_float;switch (op) {case '+':result_int = add(num1, num2);printf("%d + %d = %d\n", num1, num2, result_int);break;case '-':result_int = subtract(num1, num2);printf("%d - %d = %d\n", num1, num2, result_int);break;case '*':result_int = multiply(num1, num2);printf("%d * %d = %d\n", num1, num2, result_int);break;case '/':if (num2 == 0) {printf("Error! Division by zero.\n");} else {result_float = divide(num1, num2);printf("%d / %d = %.2f\n", num1, num2, result_float);}break;default:printf("Invalid operator!\n");}return 0;
}// 函数定义
int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}int multiply(int a, int b) {return a * b;
}float divide(int a, int b) {return (float)a / b; // 强制类型转换确保浮点除法
}