在C语言中,条件运算符(?:)也被称为三元运算符,因为它需要三个操作数。其语法格式为:
条件 ? 表达式1 : 表达式2
它首先会判断条件,如果条件为真,则执行表达式1;如果条件为假,则执行表达式2。
// 条件运算符 ? :
// C语言中 唯一一个三目运算符
// - 负号 单目运算符 1 个操作数 -1
// + 加号 双目运算符 2 个操作数 1+1
/*
格式:
条件 ? 语句1 : 语句2
当条件为真时 则执行 语句1
当条件为假时 则执行 语句2
*/
#include
// 做成正常函数
int func_MAX(int val1 , int val2)
{
return (val1 > val2) ? val1 : val2;
}
// 做成宏函数
#define MAX(VAL1 , VAL2) (VAL1 > VAL2) ? VAL1 : VAL2
int main(int argc, char const *argv[])
{
int val1, val2;
printf("请输入 val1 val2:");
scanf("%d %d", &val1, &val2);
// 打印值
printf("%d 大 \n" , (val1 > val2) ? val1 : val2 );
// 执行
(val1 > val2) ? printf("val1 大 \n") : printf("val2 大 \n");
// 使用正常函数
printf("%d 大 \n" , func_MAX(val1 , val2) );
// 使用宏函数
printf("%d 大 \n" , MAX(val1 , val2) );
return 0;
}
自增运算符(++)和自减运算符(- - )在算术表达式中容易造成使用上的错误,主要原因有两点:一是自增运算符和自减运算符在变量前后的位置不一样,其内部逻辑不一样。二是自增运算符和自减运算符只能用于变量,不能用于常量。
#include
int main(int argc, char const *argv[])
{
// ++ ==>> i++ i = i + 1
// -- ==>> i-- i = i - 1
// ++i i++ 前置和后置
// ++i 优先级最高 语句最开始运行
// i++ 优先级最低 语句最末尾运行
int i = 10;
// 误区1:
printf("i++ = %d\n" , i++);
// 后置++ 是打印之后才进行的 ++
printf("++i = %d\n" , ++i);
// 前置++ 是打印之前才进行的 ++
// 误区2
i++;
printf("i++ = %d\n" , i);
++i;
printf("++i = %d\n" , i);
// 小题目
int val1 = 10;
int val2 = 15;
printf("val = %d\n" , val1++ + ++val2);
//
int val = 10;
printf("val = %d\n" , val++ + ++val);
val = 10;
printf("val = %d\n" , val++ + val);
return 0;
}
// 前置++ 是运算前进行的 ++
// 后置++ 是运算后进行的 ++
逗号运算符(,)是C语言中优先级最低的运算符之一。它的主要作用是顺序求值,即从左到右依次计算各个表达式的值,并且整个逗号表达式的值是最后一个表达式的值。
#include
// , 逗号运算符
// 分割
// 使用方法: 可以有多个运算符 前面的内容进行运算 但是不会赋值
// 最后一个表达式进行赋值操作
int main(int argc, char const *argv[])
{
int val = 0;
int val1 = 0;
int val2 = 0;
val = (val+50 , val1+100 , val2 + 1000 , val+=30 , val1+10 , val++);
printf("val = %d\n" ,val); // 81
printf("val1 = %d\n" , val1); // 10 100 0
printf("val2 = %d\n" , val2); // 0
return 0;
}
指针运算符主要用于操作指针变量,处理指针和内存地址;
#include
int main(int argc, char const *argv[])
{
// 指针就是指向变量的地址
int val = 10;
int * val_ptr = &val;
// int * 整形指针变量
// & 取地址 用于从 val 中获取 val 的地址 用户空间
// * 解地址<解引用> 从地址中获取数据 或者 写入数据
printf("%d\n" , *val_ptr = 50);
printf("%d\n" , val);
return 0;
}
sizeof是一个单目运算符,它用于计算内存中某个对象所占的存储空间大小,单位是字节(byte)。sizeof运算符是C语言中的关键字之一,它在编译时就能确定值,因此它不是一个函数,尽管我们通常看到它被使用时伴随着括号。
#include
// sizeof 不是函数 是一个运算符
// 用于计算当前变量的占用空间大小
typedef struct
{
int val;
char ch_2;
char ch_1;
}stu;
int main(int argc, char const *argv[])
{
// 普通变量
int val = 10;
printf ("val = %d \t val_size = %ld\n" , val , sizeof(val));
// 数组变量
int arr[10] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0};
printf("arr_size = %ld\n" , sizeof(arr));
// 结构体
stu s1;
printf("s1 = %ld \n" , sizeof(s1));
// 容易出现的误区
int * arr_prt = arr;
for (size_t i = 0; i < 10; i++)
{
printf("arr = %d\t" , arr[i]);
printf("ptr = %d\n" , arr_prt[i]);
}
printf("ptr_size = %ld\n" , sizeof(arr_prt));
return 0;
}
我们一般打印输出是用的都是printf,但还有puts、putchar等。
#include
/*
输出
printf() 格式化打印输出
格式化打印输出 就是 可以参照你的格式 输出 变量 以及字符串
格式符
%d 对应整数
%f 对应浮点数
%c 对应字符
%s 对应字符串
%p 对应地址
%x 对应16进制
%o 对应8进制
描述符号
左对齐 %-8d 总共占用 8位 "123 "
右对齐 %8d
右对齐 添加符号 + %+8d " +10"
前导补0 %08d 00000123
精度 %.2f 0.00
转义字符
\n 换行
\t 水平制表符
\\ 输出斜杠
%% 输出百分号
\a 蜂鸣器
*/
/*
头文件
函数原型
函数参数
返回值
函数说明以及函数功能
// 头文件
#include
FILE *stream
暂时填写标准文件
stdin 标准输入
stdout 标准输出
int fputc(int c, FILE *stream);
功能:输出字符到文件
函数参数
@ c 你要输出的字符
@ stream 你要输出的目标文件
返回值
成功 返回输出的字符
失败 返回EOF(-1)
int fputs(const char *s, FILE *stream);
功能:输出字符串到文件
函数参数
@ s 你要输出的字符串
@ stream 你要输出的目标文件
返回值
成功 返回非负数
失败 返回EOF(-1)
// 输出字符到文件
int putc(int c, FILE *stream);
功能:输出字符到文件
函数参数
@ c 你要输出的字符
@ stream 你要输出的目标文件
返回值
成功 返回输出的字符
失败 返回EOF(-1)
int putchar(int c);
功能:输出字符到终端
函数参数
@ c 你要输出的字符
返回值
成功 返回输出的字符
失败 返回EOF(-1)
int puts(const char *s);
功能:输出字符串到终端
函数参数
@ c 你要输出的字符串
返回值
成功 返回非负数
失败 返回EOF(-1)
*/
int main(int argc, char const *argv[])
{
int val = 10;
double dou = 3.1415;
int * ptr = &val;
printf("ptr = %p\n" , ptr);
printf("ptr = 0x%x\n" , ptr);
printf("ptr = 0x%X\n" , ptr);
// 对其操作
printf("%-8d %d\n" , val , val);
printf("%8d %d\n" , val , val);
printf("%08d %d\n" , val , val);
printf("%.4f\n" , dou);
// 常用输出函数
fputc('A' , stdout);
fputc('\n' , stdout);
fputs("今天天气不错\n" , stdout);
putc('A' , stdout);
putc('\n' , stdout);
putchar('A');
puts("今天天气真不错"); // 自带回车
return 0;
}
在 C 语言里,有多种方式可以实现输入操作,scanf
是 C 语言标准库中用于格式化输入的函数,它能根据指定的格式从标准输入(通常是键盘)读取数据,并将其存储到相应的变量中。
#include
/*
scanf
// 头文件
#include
// 从文件中获取一个字符
int fgetc(FILE *stream);
功能:
参数:
返回值:
// 从文件中获取一个字符串
char *fgets(char *s, int size, FILE *stream);
功能:
参数:
返回值:
// 从终端获取一个字符
int getc(FILE *stream);
功能:
参数:
返回值:
// 从终端获取一个字符
int getchar(void);
功能:
参数:
返回值:
// 回退字符
int ungetc(int c, FILE *stream);
功能:
参数:
返回值:
*/
int main(int argc, char const *argv[])
{
int val_1 = 10;
int val_2 = 20;
scanf("%d %d", &val_1 , &val_2 );
printf("%d %d\n" , val_1 , val_2);
// 缓冲区问题 在有的时候 进行输入时 有可能会上一个输入影响到下一个输入
char buf[128];
scanf("%s" , buf);
// 方法一: 在前面加空格
scanf(" %s" , buf);
// 方法二: 在scanf 后面加getchar
scanf(" %s" , buf);
getchar();
// 方法三: 使用fflush 刷新缓冲区
fflush(stdin);
scanf(" %s" , buf);
fflush(stdin);
return 0;
}
在 C 语言中,选择结构用于根据条件判断的结果来决定执行哪一段代码;if
语句是最基本的选择结构,它根据条件表达式的真假来决定是否执行特定的代码块。
#include
#include
/*
关于 if 的编码规范
if(val == 10) // 错误写法
容易在 == 上写成 =
正确的写法
if(10 == val)
原因 后面这种写法 如果你 == 写成了 = 则会出现编译器报错 而前面的情况编译器不会报错
true 真
false 假
让你写一个数组判空函数 现在你的返回值怎么确定
为空 true
为假 false
*/
bool Is_Eat(bool Eat)
{
if (Eat == true) // 错误写法
{
printf("吃了\n");
return true;
}
if(false == Eat) // 正确写法
{
printf("没吃\n");
return false;
}
}
// bool 类型
int main(int argc, char const *argv[])
{
bool IS_mep = true;
if(IS_mep)
{
printf("为真\n");
}
IS_mep = false;
if (IS_mep = true)
{
printf("为真\n");
}
return 0;
}
在 C 语言中,循环结构用于重复执行一段代码,直到满足特定的条件为止。C 语言提供了三种主要的循环结构:for
循环、while
循环和 do-while
循环。
#include
/*
while 循环
do while 循环
for 循环
goto 循环 (禁用)
*/
int main(int argc, char const *argv[])
{
int id = 10;
int pass = 10;
int read_id = 0;
int read_pass = 0;
#if 0
int i = 3; // 循环次数
while (i--)
{
printf("请输入账号 密码");
scanf("%d %d" , &read_id , &read_pass);
if ((read_id == id) && (read_pass == pass))
{
printf("登录成功\n");
return 1;
}
else
{
printf("登录失败\n");
}
}
#endif
#if 0
int i = 3; // 循环次数
do
{
i--;
printf("请输入账号 密码");
scanf("%d %d", &read_id, &read_pass);
if ((read_id == id) && (read_pass == pass))
{
printf("登录成功\n");
return 1;
}
else
{
printf("登录失败\n");
}
} while (i);
#endif
#if 1
for (size_t i = 0; i < 3; i++)
{
printf("请输入账号 密码");
scanf("%d %d", &read_id, &read_pass);
if ((read_id == id) && (read_pass == pass))
{
printf("登录成功\n");
return 1;
}
else
{
printf("登录失败\n");
}
}
#endif
return 0;
}
在 C 语言中,函数是一段具有特定功能的、可重复使用的代码块。它可以接收输入参数,进行一系列操作,并返回一个结果。函数的使用有助于提高代码的模块化程度、可维护性和可复用性。下面从函数的定义、声明、调用、参数传递、返回值等方面详细介绍。
#include
// 函数类型 函数类型也就是函数的返回值类型 如下 int 类型
// 函数名 函数的标识符 和 变量名一样
// 参数列表 形式参数列表
// 函数体 函数内部的实现 {} 大括号里面的内容
// 函数调用 函数的调用需要用到函数的标识符 以及参数类型和个数必须匹配
// 函数定义 函数的实现
// 函数声明 向内存说明又这样的一个函数 ,可以进行调用
/*
如果 函数在 main 前面进行的定义 则不需要声明
如果 函数在 main 后面进行的定义 则需要进行声明
*/
// 声明
int add(int val_1 , int val_2);
int main(int argc, char const *argv[])
{
// 编写一个加法计算器
int val_1 = 10;
int val_2 = 10;
printf("%d + %d = %d\n" ,val_1 , val_2 , add(val_1 , val_2));
return 0;
}
// 定义
int add(int val_1 , int val_2)
{
val_1 = 90;
return val_1 + val_2;
}
在 C 语言中,数组是一种非常重要的数据结构,它用于存储一组相同类型的数据元素,这些元素在内存中是连续存储的。
sizeof
运算符和 &
运算符的操作数中除外。#include
#include
int main(int argc, char const *argv[])
{
// 如果来构建一个数组 100个 int
int arr_1[100] = {0}; // 后面全部都是 0
int arr_2[100] = {10, 20 }; // 后面全部都是 0
// 数组字符串
char buf[128] = "张三 李四 王五";
// 访问使用 下标 下标从0 开始 0-99
printf("%d" , arr_2[0]);
// 刷新缓冲区
fflush(stdout);
// 延时 函数 #include
sleep(1);
// \b 退格键
printf("\b");
return 0;
}
在 C 语言里,缓冲区是一块用于临时存储数据的内存区域。引入缓冲区主要是为了协调不同设备(如键盘、硬盘、显示器等)之间数据传输速度的差异,提高数据处理的效率。
#include
#include
// 行缓冲刷新机制 3 个
// 1、 超过 1024 字符
// 2、 有回车
// 3、 程序结束
int main(int argc, char const *argv[])
{
printf("hello");
fflush(stdout);
while (1)
{
/* code */
}
// sleep(2);
return 0;
}
输入学号、密码、成绩;3s后打印成绩最终结果如下:
#include
#include
void System_Student(){
int id[5];
int pass[5];
int sec[5];
for(int i=0;i<5;i++){
scanf("%d%d%d",&id[i],&pass[i],&sec[i]);
}
sleep(3);
printf("学号 密码 成绩\n");
for(int i=0;i<5;i++){
printf("%d %d %d\n",id[i],pass[i],sec[i]);
}
}
int main(int argc, char const *argv[])
{
System_Student();
return 0;
}
if练习
#include
#include
#include
#include
/*
if 的三种用法
// 选择语句
if(表达式)
{
}
// 选择语句
if(表达式)
{
}
else
{
}
// 分支语句
if(表达式)
{
}
else if
{
}
else
{
}
*/
void show_menu(char * buf)
{
system("clear");
printf("\n\n\n \t\t\t\t 欢迎来的 %s 界面\n" , buf);
printf("\n\n\n 按回车键返回主菜单" );
char buf_1[12];
scanf("%s" , buf_1);
}
int main(int argc, char const *argv[])
{
// 二维数组
char menu_arr[10][128];
int menu_len = 0;
char menu[128];
int option; // 选择
char option_str[128]; // 选择
system("clear");
// 往菜单数组内加入菜单项
for (size_t i = 0; i < 10; i++)
{
system("clear");
printf("输入 1 进行添加菜单 输入 0 推出添加菜单");
option = 0;
scanf("%d" , &option);
// 用户选择了 0 退出编辑
if (0 == option)
{
if (0 == menu_len)
{
printf("为输入菜单项 退出程序\n");
return 0;
}
// 推出循环
break;
}
else
{
// 清空字符串
memset(menu , 0 , sizeof(menu));
// 写入菜单字符串
printf("请输入菜单项:");
scanf("%s" , menu);
// 将菜单字符串写入到菜单中
strcpy( menu_arr[i] , menu);
// 迭代次数
menu_len++;
}
}
// 选择菜单项目 通过选择不同的菜单项 从而跳转到不同的函数
while (1)
{
system("clear");
// 打印菜单项目
for (size_t i = 0; i < menu_len; i++)
{
printf("%ld、%s\n" , i + 1 , menu_arr[i]);
}
// 选择菜单项目
printf("请输出你选择菜单的选项:(输入选项的文字)");
// 清空字符串
memset(option_str , 0 , sizeof(option_str));
scanf("%s" , option_str);
// 通过 if else if 来分支进入函数
if(!strcmp(option_str , menu_arr[0]))
{
show_menu(option_str);
}
else if(!strcmp(option_str , menu_arr[1]))
{
show_menu(option_str);
}
else
{
printf("输入有误 请重新输入\n");
sleep(2);
}
}
return 0;
}
switch练习
#include
int main(int argc, char const *argv[])
{
printf("1、查看成绩\n");
printf("2、查看账号\n");
printf("3、查看密码\n");
printf("4、查看性别\n");
int option;
int i;
scanf("%d", &option);
// 只能判定整形 只能判定 常量
switch (option)
{
case 1: // 此处只能是常量
printf("1、查看成绩\n");
break; // 跳出 当前分支 如果不跳出当前分支 则会造成 switch 穿透
case 2:
printf("2、查看账号\n");
break;
case 3: // 如果 要在分支中 声明变量 则需要增加大括号
{
int val = 50;
printf("val = %d\n", val);
break;
}
default: // 当前面条件都不满足的时候 则使用这一个
printf("输入错误\n");
break;
}
return 0;
}