C语言基本语法细则详解

C语言基本语法细则

数据类型

  • 基本数据类型:整型、浮点型、字符型

    • 整型:int、short、long、unsigned int、unsigned short、unsigned long

      int num = 10;
      short s_num = 20;
      long l_num = 30;
      unsigned int u_num = 40;
      unsigned short u_s_num = 50;
      unsigned long u_l_num = 60;
      
    • 浮点型:float、double

      float f_num = 3.14;
      double d_num = 3.1415;
      
    • 字符型:char

      char ch = 'A';
      
  • 派生数据类型:数组、结构体、共用体、枚举

    • 数组:

      int arr[5] = {1, 2, 3, 4, 5};
      
    • 结构体:

      struct student {
          int id;
          char name[20];
          float score;
      };
      struct student stu1;
      
    • 共用体:

      union data {
          int num;
          float f_num;
      };
      union data d;
      
    • 枚举:

      enum color {RED, GREEN, BLUE};
      enum color c = RED;
      

变量声明与定义

  • 变量的声明:指定变量的名称和类型,不分配内存空间

    extern int num;
    
  • 变量的定义:声明变量并分配内存空间

    int num = 10;
    

标识符命名规则

  • 只能由字母、数字和下划线组成
  • 必须以字母或下划线开头
  • 区分大小写
  • 不能使用C语言的关键字作为标识符

运算符

  • 算术运算符:+、-、*、/、%

    int a = 10;
    int b = 3;
    int sum = a + b;  // 13
    int diff = a - b;  // 7
    int product = a * b;  // 30
    int quotient = a / b;  // 3
    int remainder = a % b;  // 1
    
  • 关系运算符:==、!=、>、<、>=、<=

    int a = 10;
    int b = 3;
    if (a == b) {
        printf("a等于b");
    } else if (a != b) {
        printf("a不等于b");
    } else if (a > b) {
        printf("a大于b");
    } else if (a < b) {
        printf("a小于b");
    } else if (a >= b) {
        printf("a大于等于b");
    } else if (a <= b) {
        printf("a小于等于b");
    }
    
  • 逻辑运算符:&&、||、!

    int a = 10;
    int b = 3;
    if (a > 0 && b > 0) {
        printf("a和b都大于0");
    }
    if (a > 0 || b > 0) {
        printf("a或者b大于0");
    }
    if (!(a > 0)) {
        printf("a小于等于0");
    }
    
  • 赋值运算符:=、+=、-=、*=、/=、%=

    int a = 10;
    int b = 3;
    a += b;  // a = a + b;
    a -= b;  // a = a - b;
    a *= b;  // a = a * b;
    a /= b;  // a = a / b;
    a %= b;  // a = a % b;
    
  • 自增自减运算符:++、–

    int a = 10;
    a++;  // a = a + 1;
    a--;  // a = a - 1;
    
  • 位运算符:&、|、^、~、<<、>>

    int a = 5;  // 二进制:0101
    int b = 3;  // 二进制:0011
    int result = a & b;  // 二进制:0001,十进制:1
    result = a | b;  // 二进制:0111,十进制:7
    result = a ^ b;  // 二进制:0110,十进制:6
    result = ~a;  // 二进制:1010,十进制:-6
    result = a << 2;  // 二进制:10100,十进制:20
    result = a >> 1;  // 二进制:0010,十进制:2
    
  • 条件运算符:?:

    int a = 10;
    int b = 3;
    int max = (a > b) ? a : b;  // max为10
    
  • 其他运算符:sizeof、&、*

    int num = 10;
    int size = sizeof(num);  // size为4,int类型占用4个字节
    int *ptr = &num;  // ptr为指向num的指针
    int value = *ptr;  // value为10,取ptr指向的值
    

控制语句

  • 顺序结构:按照语句的顺序依次执行

    int a = 10;
    int b = 3;
    int sum = a + b;
    printf("和为:%d", sum);
    
  • 分支结构:if-else语句、switch语句

    int score = 80;
    
    if (score >= 90) {
        printf("优秀");
    } else if (score >= 80) {
        printf("良好");
    } else if (score >= 70) {
        printf("中等");
    } else if (score >= 60) {
        printf("及格");
    } else {
        printf("不及格");
    }
    
    switch (score / 10) {
        case 10:
        case 9:
            printf("优秀");
            break;
        case 8:
            printf("良好");
            break;
        case 7:
            printf("中等");
            break;
        case 6:
            printf("及格");
            break;
        default:
            printf("不及格");
            break;
    }
    
  • 循环结构:while循环、do-while循环、for循环、break语句、continue语句

    int i = 0;
    
    while (i < 10) {
        printf("%d ", i);
        i++;
    }
    
    int j = 0;
    
    do {
        printf("%d ", j);
        j++;
    } while (j < 10);
    
    for (int k = 0; k < 10; k++) {
        printf("%d ", k);
    }
    
    for (int m = 0; m < 10; m++) {
        if (m == 5) {
            break;  // 跳出循环
        }
        printf("%d ", m);
    }
    
    for (int n = 0; n < 10; n++) {
        if (n == 5) {
            continue;  // 跳过本次循环
        }
        printf("%d ", n);
    }
    

函数

  • 函数的声明与定义

    // 声明
    int add(int a, int b);
    
    // 定义
    int add(int a, int b) {
        return a + b;
    }
    
  • 函数的参数传递:按值传递、按指针传递

    // 按值传递
    int add(int a,  int b) {
        return a + b;
    }
    
    // 按指针传递
    void swap(int *a, int *b) {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    int main() {
        int a = 10;
        int b = 20;
        int sum = add(a, b);
        printf("和为:%d\n", sum);
    
        printf("交换前:a = %d, b = %d\n", a, b);
        swap(&a, &b);
        printf("交换后:a = %d, b = %d\n", a, b);
    
        return 0;
    }
    
    

数组

数组是一种存储相同类型数据的集合。下面是数组的一些用法示例:

数组的声明与定义

数组的声明和定义可以分开进行,也可以同时进行。以下是一些数组的声明和定义示例:

int numbers[5];  // 声明一个包含5个整数的数组

int numbers[] = {1, 2, 3, 4, 5};  // 声明并定义一个包含5个整数的数组

int numbers[5] = {1, 2, 3, 4, 5};  // 声明并定义一个包含5个整数的数组

在这些示例中,声明了一个包含5个整数的数组numbers,并分别使用了不同的方式进行了定义。

数组的元素访问

数组的元素可以通过索引进行访问,索引从0开始。以下是一些数组元素的访问示例:

int numbers[5] = {1, 2, 3, 4, 5};

printf("%d\n", numbers[0]);  // 输出第一个元素
printf("%d\n", numbers[2]);  // 输出第三个元素

numbers[3] = 10;  // 修改第四个元素的值
printf("%d\n", numbers[3]);  // 输出修改后的值

在这个示例中,定义了一个包含5个整数的数组numbers,并通过索引访问了数组的元素。

多维数组

多维数组是数组的数组,可以用于存储表格和矩阵等数据结构。以下是一些多维数组的用法示例:

int matrix[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

printf("%d\n", matrix[0][0]);  // 输出第一个元素
printf("%d\n", matrix[1][2]);  // 输出第二行第三列的元素

matrix[2][1] = 10;  // 修改第三行第二列的元素的值
printf("%d\n", matrix[2][1]);  // 输出修改后的值

在这个示例中,定义了一个3x3的二维数组matrix,并通过索引访问了数组的元素。

指针

指针是存储内存地址的变量,可以用于间接访问和修改内存中的数据。以下是一些指针的用法示例:

指针的声明与定义

指针的声明和定义可以分开进行,也可以同时进行。以下是一些指针的声明和定义示例:

int *p;  // 声明一个指向整数的指针

int *p = NULL;  // 声明并定义一个指向整数的指针,并初始化为空指针

int number = 10;
int *p = &number;  // 声明一个指向整数的指针,并将其指向number的地址

在这些示例中,声明了一个指向整数的指针p,并分别使用了不同的方式进行了定义。

指针的运算

指针可以进行取址运算和取值运算。以下是一些指针的运算示例:

int number = 10;
int *p = &number;

printf("%p\n", p);  // 输出指针的值(即变量number的地址)
printf("%d\n", *p);  // 输出指针所指向的变量的值

*p = 20;  // 修改指针所指向的变量的值
printf("%d\n", number);  // 输出修改后的值

在这个示例中,定义了一个指向整数的指针p,并通过取址运算符&获取变量number的地址,并通过取值运算符*访问指针所指向的变量。

指针作为函数参数

指针可以作为函数的参数,用于传递地址和修改变量的值。以下是一个指针作为函数参数的示例:

void changeValue(int *p) {
    *p = 20;
}

int main() {
    int number = 10;
    changeValue(&number);
    printf("%d\n", number);

    return 0;
}

在这个示例中,定义了一个changeValue函数,接受一个指向整数的指针作为参数,并通过指针修改变量的值。在主函数中调用changeValue函数,并传递变量number的地址。

动态内存分配与释放

动态内存分配可以在程序运行时分配内存空间,动态内存释放可以在程序运行时释放内存空间。以下是一些动态内存分配和释放的示例:

int *p = (int *)malloc(sizeof(int));  // 分配一个整数大小的内存空间

*p = 10;  // 在分配的内存空间中存储一个整数

free(p);  // 释放分配的内存空间

在这个示例中,使用malloc函数分配一个整数大小的内存空间,并使用free函数释放分配的内存空间。

结构体

结构体是一种自定义的数据类型,可以用于存储多个不同类型的数据。以下是一些结构体的用法示例:

结构体的声明与定义

结构体的声明和定义可以分开进行,也可以同时进行。以下是一些结构体的声明和定义示例:

struct student {
    char name[20];
    int age;
};

struct student s1;  // 声明一个结构体变量

struct student {
    char name[20];
    int age;
} s1;  // 声明并定义一个结构体变量

typedef struct {
    char name[20];
    int age;
} Student;

Student s1;  // 声明一个结构体变量

在这些示例中,声明了一个名为student的结构体,并分别使用了不同的方式进行了定义。

结构体的成员访问

结构体的成员可以通过点运算符进行访问。以下是一些结构体成员的访问示例:

struct student {
    char name[20];
    int age;
};

struct student s1;

strcpy(s1.name, "Tom");
s1.age = 20;

printf("%s\n", s1.name);
printf("%d\n", s1.age);

在这个示例中,定义了一个名为student的结构体变量s1,并通过点运算符访问了结构体的成员。

结构体作为函数参数

结构体可以作为函数的参数,用于传递结构体变量。以下是一个结构体作为函数参数的示例:

struct student {
    char name[20];
    int age;
};

void printStudent(struct student s) {
    printf("Name: %s\n", s.name);
    printf("Age: %d\n", s.age);
}

int main() {
    struct student s1;
    strcpy(s1.name, "Tom");
    s1.age = 20;

    printStudent(s1);

    return 0;
}

在这个示例中,定义了一个名为student的结构体,并在主函数中创建了一个结构体变量s1。然后,定义了一个名为printStudent的函数,接受一个结构体变量作为参数,并打印结构体的成员。

结构体指针

结构体指针可以指向结构体变量,并通过指针访问结构体的成员。以下是一些结构体指针的示例:

struct student {
    char name[20];
    int age;
};

struct student s1;
struct student *p = &s1;

strcpy(p->name, "Tom");
p->age = 20;

printf("%s\n", p->name);
printf("%d\n", p->age);

在这个示例中,定义了一个名为student的结构体变量s1,并创建了一个指向s1的结构体指针p。然后,通过指针访问结构体的成员。

枚举

枚举是一种用户定义的数据类型,用于定义一组命名常量。以下是一些枚举的示例:

枚举的声明与定义

枚举的声明和定义可以分开进行,也可以同时进行。以下是一些枚举的声明和定义示例:

enum Color {
    RED,
    GREEN,
    BLUE
};

enum Color c1;  // 声明一个枚举变量

enum Color {
    RED,
    GREEN,
    BLUE
} c1;  // 声明并定义一个枚举变量

typedef enum {
    RED,
    GREEN,
    BLUE
} Color;

Color c1;  // 声明一个枚举变量

在这些示例中,声明了一个名为Color的枚举,并分别使用了不同的方式进行了定义。

枚举的赋值

枚举的成员可以通过赋值进行初始化。以下是一些枚举的赋值示例:

enum Color {
    RED = 1,
    GREEN = 2,
    BLUE = 3
};

enum Color c1 = RED;

在这个示例中,定义了一个名为Color的枚举,并通过赋值将枚举的成员赋给枚举变量。

枚举的使用

枚举的成员可以直接使用。以下是一些枚举的使用示例:

enum Color {
    RED,
    GREEN,
    BLUE
};

enum Color c1 = RED;

if (c1 == RED) {
    printf("The color is red.\n");
} else if (c1 == GREEN) {
    printf("The color is green.\n");
} else if (c1 == BLUE) {
    printf("The color is blue.\n");
}

在这个示例中,定义了一个名为Color的枚举,并将枚举的成员赋给枚举变量c1。然后,通过if语句判断枚举的值,并打印相应的信息。

typedef

typedef可以用于定义一个新的类型别名。以下是一些typedef的示例:

typedef int Number;

Number n1 = 10;

在这个示例中,使用typedef定义了一个新的类型别名Number,并将int类型的n1赋给Number类型的变量。

共用体

共用体(union)是一种特殊的数据类型,它允许在同一内存空间中存储不同类型的数据。共用体的声明和定义可以分开进行,也可以同时进行。

声明与定义

以下是一些共用体的声明和定义示例:

union Data {
    int i;
    float f;
    char str[20];
};

union Data d1;  // 声明一个共用体变量

union Data {
    int i;
    float f;
    char str[20];
} d1;  // 声明并定义一个共用体变量

typedef union {
    int i;
    float f;
    char str[20];
} Data;

Data d1;  // 声明一个共用体变量

在这些示例中,声明了一个名为Data的共用体,并分别使用了不同的方式进行了定义。

共用体成员访问

共用体的成员访问可以使用点操作符(.)或箭头操作符(->)。以下是一些共用体的成员访问示例:

union Data {
    int i;
    float f;
    char str[20];
};

union Data d1;

d1.i = 10;
printf("%d\n", d1.i);

d1.f = 3.14;
printf("%f\n", d1.f);

strcpy(d1.str, "Hello");
printf("%s\n", d1.str);

在这个示例中,定义了一个名为Data的共用体变量d1,并通过成员访问操作符给共用体的成员赋值。然后,通过成员访问操作符读取共用体的成员的值并打印出来。

需要注意的是,共用体的不同成员共享同一块内存空间,因此对一个成员的修改会影响其他成员的值。在使用共用体时,需要确保对共用体成员的访问是合法的,否则可能会导致数据错误。

文件操作

文件操作是在C语言中进行输入和输出的重要方式之一。可以使用标准库中提供的函数来进行文件的打开、关闭、读写等操作。

文件的打开与关闭

文件的打开可以使用fopen函数,文件的关闭可以使用fclose函数。以下是一些文件的打开与关闭的示例:

#include <stdio.h>

int main() {
    FILE *file;

    // 打开文件
    file = fopen("file.txt", "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("Failed to open the file.\n");
        return 1;
    }

    // 文件操作...

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,使用fopen函数打开名为file.txt的文件,并将返回的文件指针赋给file变量。然后,使用fclose函数关闭文件。

文件的读写操作

文件的读写操作可以使用freadfwritefprintffscanf等函数。以下是一些文件的读写操作的示例:

#include <stdio.h>

int main() {
    FILE *file;
    int num;
    char str[20];

    // 打开文件
    file = fopen("file.txt", "w");

    // 写入数据
    fprintf(file, "%d %s\n", 10, "Hello");

    // 关闭文件
    fclose(file);

    // 打开文件
    file = fopen("file.txt", "r");

    // 读取数据
    fscanf(file, "%d %s", &num, str);

    // 关闭文件
    fclose(file);

    // 输出数据
    printf("%d %s\n", num, str);

    return 0;
}

在这个示例中,使用fprintf函数将数据写入名为file.txt的文件。然后,使用fscanf函数从文件中读取数据,并将读取的数据存储到相应的变量中。最后,使用printf函数输出读取的数据。

预处理指令

预处理指令是在编译之前由预处理器处理的指令,用于对源代码进行一些处理。常见的预处理指令包括#include#define#ifdef#ifndef#endif等。

  • #include用于包含头文件,将头文件的内容插入到当前位置。
  • #define用于定义宏,将一个标识符替换为相应的值或代码片段。
  • #ifdef#ifndef#endif用于条件编译,根据条件判断是否编译相应的代码。

以下是一些预处理指令的示例:

#include <stdio.h>

#define PI 3.1415926

int main() {
    double radius = 5.0;
    double area;

    area = PI * radius * radius;

    printf("The area of the circle is %f\n", area);

    return 0;
}

在这个示例中,使用#include包含了stdio.h头文件,以便使用printf函数。使用#define定义了宏PI,将其替换为3.1415926。然后,使用宏计算圆的面积,并使用printf函数输出结果。

预处理指令在编译之前被预处理器处理,可以在编译过程中对源代码进行一些特定的处理,如替换宏、条件编译等。预处理指令的使用可以提高代码的可读性和灵活性。

总结

C语言中的数据类型包括基本数据类型(整型、浮点型、字符型等)、指针、结构体、枚举等。可以使用这些数据类型来定义变量、进行运算和传递参数。掌握这些数据类型的使用方法,对于编写C语言程序是非常重要的。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值