C语言中基本语句及循环

1、条件运算符(?:)

在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;
}

2、自增(++)与自减(--)

自增运算符(++)和自减运算符(- - )在算术表达式中容易造成使用上的错误,主要原因有两点:一是自增运算符和自减运算符在变量前后的位置不一样,其内部逻辑不一样。二是自增运算符和自减运算符只能用于变量,不能用于常量。

#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;
}

// 前置++ 是运算前进行的 ++ 
// 后置++ 是运算后进行的 ++

3、逗号运算符

逗号运算符(,)是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;
}

4、指针运算符

指针运算符主要用于操作指针变量,处理指针和内存地址;

#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;
}

5、sizeof运算符

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;
}

6、输出

我们一般打印输出是用的都是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;
}

7、输入

在 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;
}

8、选择结构

在 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;
}

9、循环结构

在 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;
}

10、函数

在 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;
}

11、数组

在 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;
}

 12、缓冲区

在 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;
}

13、小测试

输入学号、密码、成绩;3s后打印成绩最终结果如下:

C语言中基本语句及循环_第1张图片

#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;
}

你可能感兴趣的:(c语言,开发语言)