C语言基本语法

class C语言

C语言是一种功能强大、语法相对简单的编程语言。理解C语言的基本语法是学习这门语言的重要第一步。以下是C语言基本语法的详细讲解,包括数据类型、变量、常量、运算符、控制结构、函数、数组、指针、结构体等核心概念。

1. 数据类型

C语言支持多种数据类型,用于存储不同类型的数据。

基本数据类型

  • 整数类型

    • int:用于表示整数。
    • short:短整型,通常为16位。
    • long:长整型,通常为32位或64位。
    • long long:长长整型,通常为64位。
  • 浮点类型

    • float:单精度浮点数。
    • double:双精度浮点数。
    • long double:扩展精度浮点数。
  • 字符类型

    • char:用于表示字符,通常为8位。
  • 布尔类型

    • _Bool:布尔类型,存储布尔值(01)。

示例代码

#include <stdio.h>

int main() {
    int a = 10; // 整数类型
    float b = 3.14; // 单精度浮点类型
    double c = 2.71828; // 双精度浮点类型
    char d = 'A'; // 字符类型
    _Bool e = 1; // 布尔类型

    printf("整数: %d\n", a);
    printf("浮点数: %.2f\n", b);
    printf("双精度: %.5f\n", c);
    printf("字符: %c\n", d);
    printf("布尔: %d\n", e);

    return 0;
}

2. 变量和常量

变量

变量是用于存储数据的命名空间。在C语言中,变量必须先声明后使用。

变量声明与初始化

#include <stdio.h>

int main() {
    int age; // 声明变量
    age = 25; // 初始化变量

    int height = 180; // 声明并初始化

    printf("年龄: %d\n", age);
    printf("身高: %d cm\n", height);

    return 0;
}

常量

常量的值在程序执行过程中不可更改。在C语言中,可以使用const关键字或#define指令定义常量。

使用const关键字

#include <stdio.h>

int main() {
    const double PI = 3.14159; // 定义常量

    printf("圆周率: %.5f\n", PI);

    // PI = 3.14; // 错误:不能修改常量

    return 0;
}

使用#define指令

#include <stdio.h>

#define PI 3.14159

int main() {
    printf("圆周率: %.5f\n", PI);

    // #define定义的常量不能在程序中被修改

    return 0;
}

3. 运算符

C语言支持多种运算符,用于执行算术运算、关系运算、逻辑运算、位运算等。

算术运算符

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • %:取模(仅用于整数)
#include <stdio.h>

int main() {
    int x = 10;
    int y = 3;

    printf("加法: %d\n", x + y);
    printf("减法: %d\n", x - y);
    printf("乘法: %d\n", x * y);
    printf("除法: %d\n", x / y);
    printf("取模: %d\n", x % y);

    return 0;
}

关系运算符

  • ==:等于
  • !=:不等于
  • >:大于
  • <:小于
  • >=:大于等于
  • <=:小于等于
#include <stdio.h>

int main() {
    int a = 5;
    int b = 10;

    printf("a 等于 b: %d\n", a == b);
    printf("a 不等于 b: %d\n", a != b);
    printf("a 大于 b: %d\n", a > b);
    printf("a 小于 b: %d\n", a < b);
    printf("a 大于等于 b: %d\n", a >= b);
    printf("a 小于等于 b: %d\n", a <= b);

    return 0;
}

逻辑运算符

  • &&:逻辑与
  • ||:逻辑或
  • !:逻辑非
#include <stdio.h>

int main() {
    int x = 1;
    int y = 0;

    printf("x 和 y 的逻辑与: %d\n", x && y);
    printf("x 和 y 的逻辑或: %d\n", x || y);
    printf("x 的逻辑非: %d\n", !x);

    return 0;
}

位运算符

  • &:按位与
  • |:按位或
  • ^:按位异或
  • ~:按位取反
  • <<:左移位
  • >>:右移位
#include <stdio.h>

int main() {
    unsigned int a = 5;  // 二进制: 00000101
    unsigned int b = 9;  // 二进制: 00001001

    printf("a 按位与 b: %d\n", a & b); // 结果: 1
    printf("a 按位或 b: %d\n", a | b); // 结果: 13
    printf("a 按位异或 b: %d\n", a ^ b); // 结果: 12
    printf("a 按位取反: %d\n", ~a); // 结果: 4294967290 (假设32位系统)
    printf("a 左移2位: %d\n", a << 2); // 结果: 20
    printf("a 右移2位: %d\n", a >> 2); // 结果: 1

    return 0;
}

赋值运算符

  • =:赋值
  • +=:加等于
  • -=:减等于
  • *=:乘等于
  • /=:除等于
  • %=:取模等于
#include <stdio.h>

int main() {
    int x = 10;

    x += 5; // 等同于 x = x + 5
    printf("x 的值: %d\n", x);

    x -= 3; // 等同于 x = x - 3
    printf("x 的值: %d\n", x);

    x *= 2; // 等同于 x = x * 2
    printf("x 的值: %d\n", x);

    x /= 4; // 等同于 x = x / 4
    printf("x 的值: %d\n", x);

    x %= 3; // 等同于 x = x % 3
    printf("x 的值: %d\n", x);

    return 0;
}

4. 控制结构

C语言提供多种控制结构,用于控制程序的执行流程。

条件语句

if语句

#include <stdio.h>

int main() {
    int num = 10;

    if (num > 0) {
        printf("正数\n");
    }

    return 0;
}

if-else语句

#include <stdio.h>

int main() {
    int num = -5;

    if (num > 0) {
        printf("正数\n");
    } else {
        printf("非正数\n");
    }

    return 0;
}

if-else if-else语句

#include <stdio.h>

int main() {
    int num = 0;

    if (num > 0) {
        printf("正数\n");
    } else if (num < 0) {
        printf("负数\n");
    } else {
        printf("零\n");
    }

    return 0;
}

switch语句

#include <stdio.h>

int main() {
    int day = 3;

    switch (day) {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
         

 printf("星期三\n");
            break;
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期日\n");
            break;
        default:
            printf("无效的日期\n");
    }

    return 0;
}

循环语句

for循环

#include <stdio.h>

int main() {
    for (int i = 0; i < 5; i++) {
        printf("for循环: %d\n", i);
    }

    return 0;
}

while循环

#include <stdio.h>

int main() {
    int i = 0;

    while (i < 5) {
        printf("while循环: %d\n", i);
        i++;
    }

    return 0;
}

do-while循环

#include <stdio.h>

int main() {
    int i = 0;

    do {
        printf("do-while循环: %d\n", i);
        i++;
    } while (i < 5);

    return 0;
}

break和continue语句

  • break:用于跳出循环或switch语句。
  • continue:用于跳过本次循环的剩余代码,直接进入下一次循环。
#include <stdio.h>

int main() {
    // 使用break跳出循环
    for (int i = 0; i < 10; i++) {
        if (i == 5) {
            break; // 当i等于5时,跳出循环
        }
        printf("i: %d\n", i);
    }

    // 使用continue跳过本次循环
    for (int i = 0; i < 10; i++) {
        if (i % 2 == 0) {
            continue; // 跳过偶数
        }
        printf("奇数: %d\n", i);
    }

    return 0;
}

5. 函数

函数是C语言中的基本模块,用于实现代码的复用和组织。

函数定义与调用

#include <stdio.h>

// 函数声明
int add(int a, int b);

int main() {
    int result = add(3, 5);
    printf("和: %d\n", result);

    return 0;
}

// 函数定义
int add(int a, int b) {
    return a + b;
}

函数的参数传递

C语言中的函数参数传递方式是“值传递”,即将实参的值复制给形参。

#include <stdio.h>

// 交换两个整数的值
void swap(int x, int y);

int main() {
    int a = 5, b = 10;

    printf("交换前: a = %d, b = %d\n", a, b);
    swap(a, b);
    printf("交换后: a = %d, b = %d\n", a, b); // a和b的值未改变

    return 0;
}

void swap(int x, int y) {
    int temp = x;
    x = y;
    y = temp;
}

使用指针进行参数传递

使用指针可以实现“引用传递”,即通过指针修改实参的值。

#include <stdio.h>

// 通过指针交换两个整数的值
void swap(int *x, int *y);

int main() {
    int a = 5, b = 10;

    printf("交换前: a = %d, b = %d\n", a, b);
    swap(&a, &b); // 传递变量a和b的地址
    printf("交换后: a = %d, b = %d\n", a, b); // a和b的值已交换

    return 0;
}

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

6. 数组

数组是一种用于存储相同类型数据的集合。

一维数组

#include <stdio.h>

int main() {
    int numbers[5] = {10, 20, 30, 40, 50};

    for (int i = 0; i < 5; i++) {
        printf("元素 %d: %d\n", i, numbers[i]);
    }

    return 0;
}

二维数组

#include <stdio.h>

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

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

字符数组(字符串)

C语言中的字符串是以'\0'结尾的字符数组。

#include <stdio.h>

int main() {
    char str[] = "Hello, World!";
  
    printf("字符串: %s\n", str);

    return 0;
}

7. 指针

指针是C语言中的一种特殊变量,用于存储变量的地址。

指针的声明与使用

#include <stdio.h>

int main() {
    int num = 10;
    int* ptr = # // 指针指向变量num的地址

    printf("变量的值: %d\n", num);
    printf("指针的值: %d\n", *ptr); // 通过指针访问变量值

    return 0;
}

指针的基本操作

  • 取地址运算符(&):用于获取变量的地址。
  • 间接访问运算符(*):用于访问指针指向的内存位置的值。
#include <stdio.h>

int main() {
    int num = 20;
    int* ptr = #

    printf("num的地址: %p\n", &num);
    printf("ptr的值: %p\n", ptr);
    printf("ptr指向的值: %d\n", *ptr);

    *ptr = 30; // 修改ptr指向的值
    printf("修改后的值: %d\n", num);

    return 0;
}

指针与数组

数组名可以被视为指向数组第一个元素的指针。

#include <stdio.h>

int main() {
    int numbers[] = {1, 2, 3, 4, 5};
    int* ptr = numbers; // 指向数组的第一个元素

    for (int i = 0; i < 5; i++) {
        printf("元素 %d: %d\n", i, *(ptr + i));
    }

    return 0;
}

动态内存分配

C语言提供malloccallocreallocfree函数用于动态内存分配和释放。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int* ptr;
    int n = 5;

    // 使用malloc分配内存
    ptr = (int*) malloc(n * sizeof(int));

    if (ptr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 初始化数组
    for (int i = 0; i < n; i++) {
        ptr[i] = i * 10;
    }

    // 输出数组
    for (int i = 0; i < n; i++) {
        printf("元素 %d: %d\n", i, ptr[i]);
    }

    // 释放内存
    free(ptr);

    return 0;
}

8. 结构体

结构体是一种用户自定义的数据类型,用于组合不同类型的数据。

结构体的定义与使用

#include <stdio.h>

// 定义结构体
struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    // 声明结构体变量
    struct Student student1;

    // 初始化结构体变量
    student1.age = 20;
    student1.gpa = 3.5;
    snprintf(student1.name, sizeof(student1.name), "Alice");

    // 输出结构体成员
    printf("姓名: %s\n", student1.name);
    printf("年龄: %d\n", student1.age);
    printf("GPA: %.2f\n", student1.gpa);

    return 0;
}

结构体数组

#include <stdio.h>

// 定义结构体
struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    // 声明结构体数组
    struct Student students[2] = {
        {"Alice", 20, 3.

5},
        {"Bob", 22, 3.8}
    };

    // 输出结构体数组成员
    for (int i = 0; i < 2; i++) {
        printf("姓名: %s, 年龄: %d, GPA: %.2f\n",
               students[i].name, students[i].age, students[i].gpa);
    }

    return 0;
}

结构体指针

#include <stdio.h>

// 定义结构体
struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    struct Student student1 = {"Alice", 20, 3.5};

    // 声明结构体指针
    struct Student* ptr = &student1;

    // 通过指针访问结构体成员
    printf("姓名: %s\n", ptr->name);
    printf("年龄: %d\n", ptr->age);
    printf("GPA: %.2f\n", ptr->gpa);

    return 0;
}

总结

C语言的基本语法涵盖了变量、常量、数据类型、运算符、控制结构、函数、数组、指针、结构体等多个方面。这些基础知识是进一步深入学习C语言编程的关键。通过编写和运行示例代码,可以更好地理解和掌握这些概念。

如果有其他具体问题或者需要更多详细解释,请随时告诉我!

评论区
评论列表
menu