当前位置: 首页 > ai >正文

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 才能直接使用 booltruefalse

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() (求数据类型或变量占用的内存字节数), & (取地址运算符), * (指针运算符/解引用), ?: (三元条件运算符)。

  • 运算符优先级和结合性: 决定了复杂表达式中运算的先后顺序。不确定时多用括号 () 明确优先级。

控制流程

条件语句 (ifelse ifelse)

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 或最内层循环 (whiledo...whilefor)。

  • 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; // 将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; // 强制类型转换确保浮点除法
}
http://www.xdnf.cn/news/13704.html

相关文章:

  • 2.4 创建视图
  • python爬虫ip封禁应对办法
  • Word 文件转md文件 在 Word 中没有直接将文档另存为 Markdown(.md)格式的选项,但你可以使用一些工具或手动转换来实现
  • spring系列---拦截器
  • NLP基础与词嵌入:让AI理解文字(superior哥深度学习系列第13期)
  • 计算机组成原理-主存储器
  • RedHat主机配置日志留存策略:从4周延长至6个月
  • 预训练模型适应下游任务?模型参数Freezing 与 微调 !
  • 基于Jenkins与Kubernetes的系统化变更管理实践
  • 《前端面试题:call、apply、bind 区别》
  • 1.sql连接语句
  • 软件测试相关问题
  • 柑橘检测模型
  • 直白话 OAuth 2 流程
  • langchain runnables 概念指南
  • 2025年硬件实习/秋招面试准备
  • 小熊派开发板显示图片
  • 机器人导航中的高程图 vs 高度筛选障碍物点云投影 —— 如何高效处理避障问题?
  • Oracle 条件索引 case when 报错解决方案(APP)
  • HTTP 网络协议演进过程
  • 【Docker基础】Docker核心概念:容器(Container)与镜像(Image)的区别与联系
  • Vue3 计算属性 computed
  • 装饰器模式(Decorator Pattern)
  • 【深尚想】M74VHC1GT08DTT1G逻辑芯片安森美ON 工业/物联网首选 电子元器件解析
  • 第29节 Node.js Query Strings
  • Kotlin 中的继承/实现
  • 2025-06-13【api】阿里百炼api调用方法
  • HarmonysOS 模块化设计理念
  • Jsoup解析商品详情时,有哪些常见的标签和属性?
  • 网络安全之CTF专题赛RE题解