前语
在Android音视频开发中,网上知识点过于琐细,自学起来难度十分大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 – 任务列表》,结合我自己的作业学习阅历,我准备写一个音视频系列blog。C/C++是音视频必备编程言语,我准备用几篇文章来快速回忆C言语。本文是音视频系列blog的其间一个, 对应的要学习的内容是:快速回忆C言语的变量和赋值,printf函数和scanf函数,判别句子,循环句子,根本数据类型,数组,函数。
音视频系列blog
音视频系列blog: 点击此处跳转查看
目录
1 C言语第一个程序
第一个程序肯定是输出“Hello World”,程序中永久的经典!!!
在C言语中,要输出 “Hello World”,能够运用规范库函数 printf
。以下是一个简略的示例代码:
#include <stdio.h>
int main() {
printf("Hello World\n");
return 0;
}
运转之后,能够看到输出的 “Hello World”。
2 变量和赋值
2.1 变量
在C言语中,变量是一种用于存储数据值的命名方位。每个变量都有一个特定的数据类型,如整数、字符、浮点数等,以确定变量能够存储的数据类型和所占用的内存巨细。变量在程序中用于存储、操作和处理数据。
以下是关于C言语变量的一些重要信息:
-
变量声明: 在运用变量之前,需求声明变量的称号和数据类型。变量声明的一般格局是:
数据类型 变量名;
,例如:int age;
表明声明晰一个名为”age”的整数型变量。 -
变量赋值: 在声明变量后,能够经过赋值操作将值存储到变量中。例如:
age = 25;
表明将整数值25存储在变量”age”中。 -
变量初始化: 变量声明的同时也能够进行初始化,即在声明变量时赋予初始值。例如:
int score = 100;
表明声明一个名为”score”的整数型变量,并将初始值设为100。 - 变量命名规矩: C言语变量的命名有必要遵从必定的规矩,如变量名只能由字母、数字和下划线组成,不能以数字开头,区别巨细写等。
- 数据类型: C言语供给了多种数据类型,包括根本数据类型(如整数、浮点数、字符)以及派生数据类型(如数组、结构体、指针)。不同数据类型具有不同的取值规模和所占内存巨细。
- 效果域: 变量的效果域指的是变量在程序中可见的规模。C言语中有局部变量和全局变量两种,局部变量只在特定代码块内可见,而全局变量在整个程序中都可见。
-
const关键字: 运用
const
关键字能够声明一个常量,即一个不行更改的变量。常量的值在程序运转过程中不能被修改。 -
sizeof运算符:
sizeof
运算符用于获取变量或数据类型所占用的字节数。例如:int size = sizeof(int);
表明获取整数类型所占的字节数并存储在变量”size”中。
以下是一些示例:
#include <stdio.h>
int main() {
int age; // 声明一个整数型变量
age = 25; // 赋值操作
int score = 100; // 声明并初始化一个整数型变量
const double pi = 3.14159; // 声明一个常量
printf("Age: %d\n", age);
printf("Score: %d\n", score);
printf("Pi: %f\n", pi);
return 0;
}
以上代码演示了变量的声明、赋值、初始化以及常量的运用。
2.2 赋值
在C言语中,赋值是将一个值存储到变量中的过程。赋值操作运用赋值运算符(=
)来完结。赋值运算符将右侧的值赋给左面的变量。
以下是赋值操作的根本语法:
variable = expression;
其间,variable
是要接纳赋值的变量,而 expression
是要赋给变量的值或表达式。
例如:
int x; // 声明一个整数型变量
x = 10; // 将值10赋给变量x
double pi = 3.14159; // 声明并初始化一个双精度浮点型变量
你还能够在赋值操作中运用表达式,如:
int a = 5;
int b = 3;
int c = a + b; // 将a加b的成果赋给变量c
需求留意的是,赋值运算是从右向左进行的。即右边的表达式会被计算,然后将计算成果赋给左面的变量。
此外,C言语还支撑复合赋值运算符,这些运算符将运算符与赋值操作结合起来,以简化代码。例如:
int num = 10;
num += 5; // 等同于 num = num + 5;
num *= 2; // 等同于 num = num * 2;
这些复合赋值运算符能够将操作和赋值合并到一个句子中。
赋值是C言语中重要的操作之一,答应你将值存储在变量中,以便在程序中进行操作和处理。
3 printf函数和scanf函数
3.1 printf函数
printf
是C言语中用于输出信息到规范输出(一般是终端或命令行窗口)的函数。它是C规范库中的一个函数,用于在屏幕上显示文本或变量的值。
以下是 printf
函数的根本语法:
#include <stdio.h> // 包括头文件以运用printf函数
int main() {
printf("Hello, world!\n"); // 输出字符串并换行
return 0;
}
在上述示例中,printf
函数输出了字符串 "Hello, world!"
,而且运用 \n
进行换行。
printf
函数中能够运用格局操控符来指定输出的格局。一些常见的格局操控符包括:
-
%d
:用于输出整数。 -
%f
:用于输出浮点数。 -
%c
:用于输出字符。 -
%s
:用于输出字符串。 -
%x
:用于输出十六进制整数。
以下是一个运用格局操控符的示例:
#include <stdio.h>
int main() {
int age = 25;
float height = 175.5;
char grade = 'A';
char name[] = "John";
printf("Age: %d\n", age);
printf("Height: %.2f\n", height); // 输出浮点数并操控小数点后的位数
printf("Grade: %c\n", grade);
printf("Name: %s\n", name);
return 0;
}
在这个示例中,%d
、%.2f
、%c
和 %s
是格局操控符,它们会被 printf
函数替换为相应的变量的值。
留意,格局操控符能够带有附加信息,如 .2
在 %f
后面表明要输出的浮点数保存两位小数。
printf
函数是C言语中用于输出内容的重要东西,能够帮助你在屏幕上显示文本、变量值以及格局化信息。
3.2 scanf函数
scanf
是C言语中用于从规范输入(一般是键盘)获取输入数据并存储到变量中的函数。它是C规范库中的一个函数,用于读取用户输入的数据。
以下是 scanf
函数的根本语法:
#include <stdio.h> // 包括头文件以运用scanf函数
int main() {
int num;
printf("Enter a number: ");
scanf("%d", &num); // 从用户输入读取整数,并将值存储到num变量中
printf("You entered: %d\n", num);
return 0;
}
在上述示例中,scanf
函数等待用户输入一个整数,并运用 %d
格局操控符将输入的值存储到变量 num
中。需求留意的是,scanf
函数的参数中变量前面需求加上 &
符号,表明取该变量的地址。
假如你想获取多个输入,能够在 scanf
函数中运用多个格局操控符,如:
#include <stdio.h>
int main() {
int age;
float height;
printf("Enter your age: ");
scanf("%d", &age);
printf("Enter your height (in cm): ");
scanf("%f", &height);
printf("Age: %d, Height: %.2f\n", age, height);
return 0;
}
在输入多个值时,需求保证输入的数据类型与格局操控符相匹配,不然或许会导致过错或意外行为。
需求留意的是,scanf
函数对输入数据的处理或许会有一些限制和安全性问题,例如,它对过错的输入处理不佳。在实践应用中,或许需求添加额外的输入验证来保证输入的数据有效和合理。
scanf
函数是C言语中用于获取用户输入的函数,能够帮助你从规范输入读取数据并存储到变量中。
4 if else句子和switch句子
4.1 if else句子
if
和 else
是C言语中用于操控程序流程的条件句子。它们答应你依据条件的真假来履行不同的代码块。
以下是 if
和 else
句子的根本语法:
if (condition) {
// 假如条件为真,履行这儿的代码块
} else {
// 假如条件为假,履行这儿的代码块
}
在上述语法中,condition
是一个表达式,它的值会被判别为真(非零)或假(零)。假如 condition
为真,那么 if
代码块中的代码将被履行。假如 condition
为假,那么 else
代码块中的代码将被履行。
以下是一个简略的比如:
#include <stdio.h>
int main() {
int num = 10;
if (num > 0) {
printf("The number is positive.\n");
} else {
printf("The number is non-positive.\n");
}
return 0;
}
在这个比如中,假如变量 num
的值大于0,那么会输出 “The number is positive.”,不然会输出 “The number is non-positive.”。
你也能够运用多个 if
和 else if
来构建更复杂的条件判别结构:
#include <stdio.h>
int main() {
int score;
printf("Enter your score: ");
scanf("%d", &score);
if (score >= 90) {
printf("Grade: A\n");
} else if (score >= 80) {
printf("Grade: B\n");
} else if (score >= 70) {
printf("Grade: C\n");
} else if (score >= 60) {
printf("Grade: D\n");
} else {
printf("Grade: F\n");
}
return 0;
}
在这个比如中,依据输入的分数,程序会输出对应的等级。
if
和 else
句子是构建条件逻辑的根底,它们使你能够依据不同的条件履行不同的代码块,然后完成更灵敏和有针对性的程序行为。
4.2 switch句子
switch
句子是C言语中用于依据不同的条件值履行不同代码块的一种挑选结构。它适用于当你有多个固定的选项需求进行挑选时,能够将多个条件分支进行组织,使代码更清晰、简练。
以下是 switch
句子的根本语法:
switch (expression) {
case constant1:
// 履行代码块1
break;
case constant2:
// 履行代码块2
break;
// 更多 case 分支
default:
// 履行默认代码块(可选)
}
在上述语法中,expression
是一个表达式,而 constant1
、constant2
等是常量或常量表达式。switch
句子会依据 expression
的值进行匹配,然后依据匹配到的常量履行对应的代码块。假如没有匹配到任何常量,能够运用 default
分支。
以下是一个简略的比如:
#include <stdio.h>
int main() {
char operator;
double num1, num2;
printf("Enter an operator (+, -, *, /): ");
scanf("%c", &operator);
printf("Enter two numbers: ");
scanf("%lf %lf", &num1, &num2);
switch (operator) {
case '+':
printf("%.2lf + %.2lf = %.2lf\n", num1, num2, num1 + num2);
break;
case '-':
printf("%.2lf - %.2lf = %.2lf\n", num1, num2, num1 - num2);
break;
case '*':
printf("%.2lf * %.2lf = %.2lf\n", num1, num2, num1 * num2);
break;
case '/':
if (num2 != 0) {
printf("%.2lf / %.2lf = %.2lf\n", num1, num2, num1 / num2);
} else {
printf("Cannot divide by zero.\n");
}
break;
default:
printf("Invalid operator.\n");
}
return 0;
}
在这个比如中,依据用户输入的操作符,程序运用 switch
句子来挑选不同的操作。
需求留意的是,在每个 case
分支的结尾要运用 break
关键字,以防止代码持续履行其他分支。假如没有 break
,程序会持续履行后续的分支代码。
5 while句子、do句子和 for句子
5.1 while句子
while
是C言语中用于创立循环的一种迭代句子。它答应你依据条件的真假重复履行一段代码块,直到条件不再满意停止。
以下是 while
循环的根本语法:
while (condition) {
// 循环体,假如条件为真则履行
}
在上述语法中,condition
是一个表达式,假如其值为真(非零),则会重复履行循环体中的代码。当 condition
的值为假(零),循环会停止,程序将持续履行循环后的代码。
以下是一个简略的比如:
#include <stdio.h>
int main() {
int count = 1;
while (count <= 5) {
printf("Count: %d\n", count);
count++;
}
return 0;
}
在这个比如中,count
从 1 开端递加,当 count
小于等于 5 时,循环会一向重复履行输出 Count
的值,并递加 count
直到达到 6。需求留意的是,假如 condition
一开端就为假,while
循环的代码块或许永久不会被履行。
你能够运用 while
循环来处理不确定次数的迭代,只需条件满意,循环会一向运转。为了防止无限循环,保证在循环体内改变循环条件或者运用适当的操控句子来停止循环。
5.2 do句子
当运用 do
…while
句子时,循环体中的代码会至少被履行一次,然后在循环结束时查看循环条件。这使得 do
…while
循环在一些特定场景下十分有用,例如需求至少履行一次某个操作,然后依据条件判别是否持续履行。
以下是一个示例,展现了怎么运用 do
…while
循环来获取用户输入并验证输入的有效性:
#include <stdio.h>
int main() {
int number;
do {
printf("Enter a positive number: ");
scanf("%d", &number);
if (number <= 0) {
printf("Invalid input. Please enter a positive number.\n");
}
} while (number <= 0);
printf("You entered a positive number: %d\n", number);
return 0;
}
在这个比如中,循环体首先要求用户输入一个数字,然后查看该数字是否为正数。假如输入的数字不是正数,循环会持续履行,要求用户从头输入,直到输入的数字是正数停止。
需求留意的是,do
…while
循环在判别循环条件之前至少会履行一次循环体中的代码。这与其他循环结构(如 while
循环)不同,其他循环结构会在判别循环条件之前查看是否要履行循环体。
do
…while
循环在需求至少履行一次循环体的情况下很有用,能够保证在查看循环条件之前,循环体内的代码至少会被履行一次。
5.3 for句子
for
是C言语中用于创立循环的一种迭代句子,它供给了一种简练的方法来操控循环的初始化、条件和递加。
以下是 for
循环的根本语法:
for (initialization; condition; increment) {
// 循环体
}
在上述语法中,initialization
是循环初始化的表达式,它在循环开端之前被履行一次。condition
是循环的条件表达式,假如条件为真(非零),则循环体会被履行。increment
是循环递加表达式,它在每次循环迭代结束后被履行。
以下是一个简略的比如:
#include <stdio.h>
int main() {
for (int i = 1; i <= 5; i++) {
printf("Iteration: %d\n", i);
}
return 0;
}
在这个比如中,for
循环从 i
初始化为 1 开端,然后在 i
小于等于 5 的条件下重复履行循环体。在每次循环迭代结束后,i
会递加一次。
你能够依据需求在 initialization
、condition
和 increment
部分编写相应的表达式,以操控循环的行为。例如,你能够创立从恣意起始值到恣意结束值的循环,也能够运用负值或浮点数作为循环操控。
以下是一个计算阶乘的比如,运用 for
循环:
#include <stdio.h>
int main() {
int n;
int factorial = 1;
printf("Enter a positive integer: ");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
factorial *= i;
}
printf("Factorial of %d: %d\n", n, factorial);
return 0;
}
在这个比如中,for
循环用于计算给定正整数的阶乘。循环从 1 到输入的整数 n
进行迭代,并将每次迭代的值乘到 factorial
中。
for
循环是C言语中用于操控循环的一种强大方法,它供给了初始化、条件和递加的结构,使得循环逻辑更加紧凑。
6 根本数据类型
C言语中的根本数据类型用于存储不同品种的数据,如整数、浮点数、字符等。这些根本数据类型能够用于声明变量、函数参数和回来值等。
以下是C言语中常见的根本数据类型:
-
整数类型:
-
int
:整数类型,一般占用4个字节(32位)的内存。 -
short
:短整数类型,一般占用2个字节(16位)的内存。 -
long
:长整数类型,占用4个字节或8个字节的内存,详细取决于编译器和操作系统。 -
long long
:更长的整数类型,一般占用8个字节的内存。
-
-
无符号整数类型:
-
unsigned int
:无符号整数类型,存储非负整数。 -
unsigned short
:无符号短整数类型。 -
unsigned long
:无符号长整数类型。 -
unsigned long long
:无符号更长的整数类型。
-
-
字符类型:
-
char
:字符类型,一般占用1个字节的内存,用于存储ASCII码中的字符。
-
-
浮点数类型:
-
float
:单精度浮点数类型,一般占用4个字节的内存,用于存储小数。 -
double
:双精度浮点数类型,一般占用8个字节的内存,供给更高的精度。
-
-
布尔类型:
-
bool
(需求包括<stdbool.h>
头文件):布尔类型,存储true
或false
值。
-
C言语的规范库还界说了一些用于表明内存巨细和数据规模的宏,如 sizeof
运算符用于获取数据类型的字节数,INT_MAX
和 INT_MIN
分别表明 int
类型的最大和最小值等。
例如,以下代码演示了怎么声明不同的根本数据类型的变量和运用一些宏:
#include <stdio.h>
#include <limits.h> // 包括一些整数类型的规模宏
int main() {
int myInt = 42;
char myChar = 'A';
float myFloat = 3.14;
double myDouble = 2.71828;
bool myBool = true;
printf("Size of int: %lu bytes\n", sizeof(int));
printf("Size of char: %lu bytes\n", sizeof(char));
printf("Size of float: %lu bytes\n", sizeof(float));
printf("Size of double: %lu bytes\n", sizeof(double));
printf("Size of bool: %lu byte\n", sizeof(bool));
printf("Maximum value of int: %d\n", INT_MAX);
printf("Minimum value of int: %d\n", INT_MIN);
return 0;
}
在上述示例中,咱们展现了不同数据类型的声明、sizeof
运算符的运用以及一些整数规模的宏。
7 数组
7.1 一维数组
在C言语中,一维数组是一种用于存储相同数据类型元素的线性数据结构。数组答应你在一个变量中存储多个相同类型的值,并经过索引拜访这些值。数组的索引从0开端,逐渐递加。
以下是一维数组的根本语法:
data_type array_name[array_size];
在上述语法中,data_type
是数组中元素的数据类型,array_name
是数组的称号,array_size
是数组的巨细,即能够存储的元素个数。
以下是一个示例,展现怎么声明、初始化和拜访一维数组:
#include <stdio.h>
int main() {
int numbers[5]; // 声明一个包括5个整数的数组
// 初始化数组
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
numbers[3] = 40;
numbers[4] = 50;
// 拜访和输出数组元素
printf("Element at index 0: %d\n", numbers[0]);
printf("Element at index 1: %d\n", numbers[1]);
printf("Element at index 2: %d\n", numbers[2]);
printf("Element at index 3: %d\n", numbers[3]);
printf("Element at index 4: %d\n", numbers[4]);
return 0;
}
在这个示例中,咱们声明晰一个名为 numbers
的整数数组,然后初始化数组的各个元素,最后经过索引拜访并输出了数组中的元素。
你也能够在声明数组时同时进行初始化:
int numbers[5] = {10, 20, 30, 40, 50};
假如不显式供给初始化值,数组的元素将会被自动初始化为0(对于数字类型)或者空字符 '\0'
(对于字符类型)。
一维数组在C言语中是十分常用的数据结构,用于存储列表、序列和集合等数据。数组的索引从0开端,留意在拜访数组元素时,索引不能超出数组的规模,不然或许导致未界说的行为。
7.2 二维数组
二维数组是C言语中的一种数据结构,用于存储表格方法的数据,即具有行和列的数据。二维数组实践上是由多个一维数组组成的,每个一维数组代表二维数组的一行。
以下是二维数组的根本语法:
data_type array_name[row_size][column_size];
在上述语法中,data_type
是数组中元素的数据类型,array_name
是数组的称号,row_size
是数组的行数,column_size
是数组的列数。
以下是一个示例,展现怎么声明、初始化和拜访二维数组:
#include <stdio.h>
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 拜访和输出二维数组元素
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
在这个示例中,咱们声明晰一个名为 matrix
的3行4列的整数二维数组,然后初始化数组的各个元素,并运用两层循环来遍历并输出整个二维数组。
你也能够在声明二维数组时省略行数,只指定列数,然后在初始化时依据需求供给行数:
int matrix[][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
二维数组在模仿矩阵、表格等多维数据时十分有用。留意,在拜访二维数组元素时,需求运用两个索引来指定行和列的方位。相同要保证索引不超出数组的规模,以防止拜访无效内存。
7.3 三维数组
三维数组是C言语中的一种高维数据结构,用于存储立体的数据。类似于二维数组,三维数组实践上是由多个二维数组组成的,每个二维数组代表三维数组的一个平面。
以下是三维数组的根本语法:
data_type array_name[depth_size][row_size][column_size];
在上述语法中,data_type
是数组中元素的数据类型,array_name
是数组的称号,depth_size
是数组的深度,row_size
是数组的行数,column_size
是数组的列数。
以下是一个示例,展现怎么声明、初始化和拜访三维数组:
#include <stdio.h>
int main() {
int cube[2][3][4] = {
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
},
{
{13, 14, 15, 16},
{17, 18, 19, 20},
{21, 22, 23, 24}
}
};
// 拜访和输出三维数组元素
for (int d = 0; d < 2; d++) {
printf("Depth %d:\n", d + 1);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", cube[d][i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
在这个示例中,咱们声明晰一个名为 cube
的2层3行4列的整数三维数组,然后初始化数组的各个元素,并运用三层循环来遍历并输出整个三维数组。
三维数组在模仿立体的数据、图像处理等范畴十分有用。留意,在拜访三维数组元素时,需求运用三个索引来指定深度、行和列的方位。相同要保证索引不超出数组的规模,以防止拜访无效内存。
8 函数
8.1 函数界说与运用
函数是C言语中的重要概念,用于将代码组织成可重用、模块化的块。函数答应你将一段特定的功用代码封装起来,并在需求时经过调用函数来履行该功用。
以下是界说和调用函数的根本语法:
return_type function_name(parameters) {
// 函数体,履行详细功用
// 能够包括多条句子
return value; // 回来值(可选)
}
在上述语法中:
-
return_type
是函数的回来类型,指定函数回来的数据类型(如int
、float
、void
等)。 -
function_name
是函数的称号,用于在其他当地调用函数。 -
parameters
是函数的参数列表,用于接纳函数调用时传递的参数。 -
return value
(可选)是函数的回来句子,用于回来一个值给调用者。
以下是一个示例,展现怎么界说和调用一个简略的函数:
#include <stdio.h>
// 函数界说
int add(int a, int b) {
int result = a + b;
return result;
}
int main() {
int num1 = 5, num2 = 7;
// 调用函数并将回来值赋给变量
int sum = add(num1, num2);
printf("Sum: %d\n", sum);
return 0;
}
在这个示例中,咱们界说了一个名为 add
的函数,它承受两个整数参数并回来它们的和。然后在 main
函数中调用了这个函数,并将回来的成果赋给变量 sum
,然后输出了和。
需求留意的是,函数需求在调用之前进行声明或界说。假如函数界说在 main
函数之后,你需求在 main
函数之前供给函数的原型声明。函数的参数和回来类型在声明和界说时需求共同。
C言语中的函数答应你将代码划分红更小的模块,提高了代码的可维护性和可读性。它们还能够被多次调用,使代码得到重复运用。
8.2 函数的参数
函数的参数是在函数界说中用于接纳传递给函数的值的变量。参数答应你在函数内部运用外部传入的数据,然后完成更通用和可定制的函数功用。
C言语中函数的参数能够分为两品种型:方法参数(也称为形参)和实践参数(也称为实参)。
-
方法参数(形参):
方法参数是函数界说中声明的参数,用于接纳传递给函数的值。方法参数只在函数内部起效果,它们的值在函数调用时由实践参数传递。方法参数的声明方法一般在函数的原型和界说中的参数列表中,例如:
int add(int a, int b) { // 函数体 }
-
实践参数(实参):
实践参数是在函数调用时供给的参数值。实践参数能够是常量、变量、表达式等。在函数调用时,实践参数的值被传递给方法参数,然后函数能够运用这些值进行计算或处理。在调用函数时,实践参数能够依照方法参数的顺序进行传递,例如:
int main() { int result = add(5, 7); // 5和7是实践参数 // ... }
函数的参数使得函数能够处理不同的数据,并依据传入的值履行相应的操作。在函数界说中,你能够在方法参数的方位运用这些参数,就像运用一般的变量一样。调用函数时,实践参数的值会被复制到方法参数中,然后函数能够运用它们履行操作。
需求留意的是,参数的数据类型和顺序在函数声明和调用时有必要共同。参数的称号能够在函数界说和调用中不同,称号只在函数内部起效果。