1. while循环

  • 特点:while循环会在每次循环开始前检查条件表达式,如果条件为真,则执行循环体。
  • 适用场景:当你不确定需要循环执行多少次时,while循环是一个好选择。适用于循环次数依赖于外部条件的情况。
  • 示例:
    int i = 0;
    while (i < 5) {
        printf("%d ", i);
        i++;
    }

    2. for循环

  • 特点:for循环将循环的初始化、条件检查和更新都集成在一个语句中,使得循环控制更加集中和明确。
  • 适用场景:当你知道循环需要执行的确切次数,或者对循环变量的初始化和更新有明确的要求时,for循环是最佳选择。常用于遍历数组或集合。
  • 示例:
    for (int i = 0; i < 5; i++) {
        printf("%d ", i);
    }

    3. do-while循环

  • 特点:do-while循环至少执行一次循环体,然后再检查条件表达式。循环体总是在条件检查之前执行。
  • 适用场景:适用于至少需要执行一次循环体的情况,例如,至少需要显示一次菜单的用户交互程序。
  • 示例:
    int i = 0;
    do {
        printf("%d ", i);
        i++;
    } while (i < 5);

总结:

  • 使用while循环时,如果初始条件不满足,循环体可能一次都不会执行。
  • for循环适用于循环次数已知或者对循环变量的控制较为复杂的情况,它使代码更加紧凑和清晰。
  • do-while循环保证了循环体至少执行一次,适用于先执行后判断的场景。

在C语言中,char是一种基本数据类型,用来存储单个字符。在内存中,char类型通常占用1个字节(但这也取决于具体的编译器和系统架构),可以存储标准的ASCII字符集中的任意字符。ASCII字符集包括英文大小写字母、数字、标点符号以及控制字符等,每个字符都对应一个介于0到127的整数值。

char类型的使用

  • 声明字符变量:使用char关键字可以声明字符变量。
    char letter = 'A';
    char digit = '1';
    char symbol = '@';

    在这里,字符常量用单引号(')括起来,表示它是一个字符,而不是字符串。

  • 字符数组与字符串:char类型的数组可以用来存储字符串。在C语言中,字符串实际上是以空字符'\0'(ASCII值为0)结尾的字符数组。
    char name[5] = "John";

    在这个例子中,name数组将包含字符'J'、'o'、'h'、'n'和'\0'。虽然只有4个可见字符,但C语言的字符串总是以空字符结束,因此需要一个额外的位置来存储这个空字符。

    char和整数类型的转换

    在C语言中,char类型实际上存储的是整数值,这意味着char类型的变量可以参与数值运算。

  • 每个字符都有一个与之对应的ASCII值。例如,字符'A'的ASCII值是65,字符'0'的ASCII值是48。
  • 可以直接将char类型的变量与整数进行比较或赋值。
    char letter = 65; // 等同于 char letter = 'A';

    符号问题

    char类型分为两种:signed char和unsigned char。

  • signed char:可以表示的范围通常是-128到127(取决于系统和编译器),它可以存储负值。
  • unsigned char:可以表示的范围是0到255,仅用来存储正值或零。
    默认情况下,如果没有显式指定signed或unsigned,char的有符号性(是否可以表示负数)是由编译器决定的。
    应用
    char类型在处理字符数据时非常有用,比如读写文本文件、处理用户输入、显示消息等场合。理解char类型及其与整数值之间的关系是掌握C语言字符串和字符操作的基础。
// 函数用起泡法对输入的10个整数按由小到大的顺序排列
#include <stdio.h>
// 该函数接受一个整型数组x[] 作为参数。它用两层嵌套循环实现冒泡排序,外层循环控制遍历的轮数,内层循环用于实际的比较和交换两个相邻的元素。如果发现顺序错误(即x[i] > x[i + 1]),则通过中间变量t交换这两个元素的位置。这个过程会持续直到数组完全排序。
int paixu(int x[])
{
    int i, j, t;
    for (j = 1; j < 10; j++)
        for (i = 0; i <= 9 - j; i++)
            if (x[i] > x[i + 1])
            {
                t = x[i + 1]; //将x[i + 1]的值暂存到变量t中。
                x[i + 1] = x[i]; //将x[i]的值赋给x[i + 1],这样x[i + 1]就存放了较大的值
                x[i] = t; //将暂存的较小的值(原x[i + 1]的值,现存储于t中)赋给x[i]
            }
}
//**函数main**:这是程序的入口点。首先,它声明了一个整型数组y[10]用于存放用户输入的10个整数。通过一个for循环,程序使用scanf函数读取用户输入的10个整数并存储在数组y中。然后,调用paixu函数对这些数进行排序。最后,再次使用一个for循环和printf函数,按排序后的顺序输出这10个整数。
int main()
{
    int y[10];
    int i;
    for (i = 0; i < 10; i++)
        scanf("%d", &y[i]); // 在C语言中,使用&操作符获取变量的地址。因为scanf需要知道在内存中的哪个位置存放读入的值,所以必须传递变量的地址而不是变量的值。这里,&y[i]表示数组y中第i个元素的地址。
    paixu(y);
    for (i = 0; i < 10; i++)
        printf("%5d", y[i]); // 用于格式化输出数组y的元素。其中,%5d指示printf以十进制整数的形式输出y[i]的值,并且为这个值分配至少5个字符的宽度。如果y[i]的值占用的字符数少于5个,输出将通过在前面添加空格来对齐,确保每个值占用的空间都是相同的。这样做的目的是为了使输出整齐、易于阅读。
    printf("\n");
    // 用于在输出完数组的所有元素后换行。没有这个语句,所有的输出会连续显示在一行上,可能会让人难以阅读。通过添加换行符\n,可以在输出每个数组之后将光标移动到下一行,从而使输出结果更加清晰。
    return 0;
}

可以安装MinGW或Cygwin来获取GCC编译器。MinGW是一个较为推荐的选择

安装VSCode的C/C++扩展
打开VSCode,前往扩展市场(快捷键Ctrl+Shift+X或Cmd+Shift+X),搜索并安装“C/C++”扩展(作者为Microsoft)。

使用Chocolatey安装MinGW

choco install mingw

编译C程序

  • 编译程序
    gcc hello.c -o hello

    这条命令告诉GCC编译器(gcc)去编译源文件hello.c,并将编译后的可执行文件命名为hello。如果不使用-o选项,GCC默认生成的可执行文件名为a.out(在Unix和Linux系统上)。

  • 指定编译标准
    gcc -std=c99 hello.c -o hello

    这条命令通过-std=c99选项指定使用C99标净来编译程序。你也可以根据需要选择其他标准,如c89、c11等。

  • 开启所有警告
    gcc -Wall hello.c -o hello

    使用-Wall选项让GCC显示所有警告信息,这对于发现和修正潜在的错误非常有帮助。

  • 运行C程序

运行程序

  • 在Windows上:

    ./hello

    其他有用的GCC选项

  • 生成调试信息

    gcc -g hello.c -o hello

    使用-O2选项来让GCC对代码进行优化,以提高程序运行的效率。GCC提供了不同级别的优化选项,从-O0(无优化)到-O3(尽可能强的优化),以及-Os(优化程序大小)。

  • 定义宏

    gcc -DNAME=VALUE hello.c -o hello