【C语言】一篇通关所有 “关键字”,值得收藏篇!

简介: 关键字是编程语言预定义的保留词,代表特定的操作或结构。C语言中的关键字用于定义变量类型、控制语句、存储类、数据类型等。使用这些关键字可以创建函数、控制程序的流程、声明变量和常量等。

c_keyword.png

C语言关键字

C语言关键字是编程语言中的保留词,用于执行特定的操作。关键字有特殊含义,不能用作变量、函数、或任何其他标识符的名称。关键字为C编译器提供语法结构,使其能够理解和执行程序。

1. 概念

关键字是编程语言预定义的保留词,代表特定的操作或结构。C语言中的关键字用于定义变量类型、控制语句、存储类、数据类型等。使用这些关键字可以创建函数、控制程序的流程、声明变量和常量等。

2. 来源原理

C语言的关键字来源于其设计目标,即为系统编程提供一种简洁、高效、可移植的语言。C语言由Dennis Ritchie在贝尔实验室于1972年开发,并基于B语言改进而成。C语言的关键字设计反映了其简洁性和强大的功能,使其成为编写操作系统和其他系统软件的理想选择。

3. 代码示例

下面是一个简单的C语言程序,展示了部分关键字的使用:

#include <stdio.h>

int main() {
   
    int a = 10;       // int 关键字用于声明整数变量
    float b = 5.5;    // float 关键字用于声明浮点数变量
    const int c = 20; // const 关键字用于声明常量
    if (a > b) {
         // if 关键字用于条件语句
        printf("a is greater than b\n");
    } else {
             // else 关键字用于条件语句的替代分支
        printf("a is not greater than b\n");
    }
    return 0;         // return 关键字用于函数返回值
}

4. 代码详解

  1. #include <stdio.h>:包含标准输入输出库,用于使用printf函数。
  2. int main():定义主函数,程序执行从这里开始。
  3. int a = 10;:声明一个整数变量a并初始化为10。
  4. float b = 5.5;:声明一个浮点数变量b并初始化为5.5。
  5. const int c = 20;:声明一个整数常量c,值为20。
  6. if (a > b):条件语句,如果a大于b,则执行printf("a is greater than b\n");
  7. else:如果a不大于b,则执行printf("a is not greater than b\n");
  8. return 0;:返回0,表示程序成功结束。

5. C语言关键字列表

5.1 数据类型关键字

关键字 描述
char 声明字符变量
double 声明双精度浮点数变量
float 声明浮点数变量
int 声明整数变量
long 声明长整数变量
short 声明短整数变量
void 声明无返回值类型

5.2 存储类关键字

关键字 描述
auto 声明自动变量
extern 声明外部变量
register 声明寄存器变量
static 声明静态变量
volatile 声明易变变量

5.3 控制语句关键字

关键字 描述
break 退出当前循环或switch语句
case switch语句中的分支
continue 跳过当前循环的剩余部分,继续下一次迭代
default switch语句中的默认分支
do 声明do-while循环
else if语句的替代分支
for 声明for循环
goto 无条件跳转到指定标签
if 声明条件语句
return 结束函数并返回值
switch 声明switch多分支选择语句
while 声明while循环

5.4 其他关键字

关键字 描述
const 声明只读变量
enum 声明枚举类型
sizeof 计算数据类型或变量的大小
struct 声明结构体类型
typedef 为数据类型定义别名
union 声明联合类型
unsigned 声明无符号类型变量

通过理解和使用这些关键字,程序员可以编写功能强大、逻辑清晰的C语言程序。

示例扩展 1:使用struct关键字

#include <stdio.h>

// 使用struct关键字定义一个结构体
struct Point {
   
    int x; // x坐标
    int y; // y坐标
};

int main() {
   
    // 声明一个Point类型的变量,并初始化
    struct Point p1 = {
   10, 20};

    // 输出结构体成员
    printf("Point p1: x = %d, y = %d\n", p1.x, p1.y);

    return 0;
}

结构体代码详解

  1. struct Point { int x; int y; };:使用struct关键字定义一个名为Point的结构体,包含两个整数成员xy
  2. struct Point p1 = {10, 20};:声明一个Point类型的变量p1,并初始化其成员x为10,y为20。
  3. printf("Point p1: x = %d, y = %d\n", p1.x, p1.y);:输出结构体成员的值。

通过使用struct关键字,程序员可以创建自定义的数据类型,将相关数据组织在一起,方便管理和操作。

示例扩展 2:使用enum关键字

#include <stdio.h>

// 使用enum关键字定义一个枚举类型
enum Weekday {
   
    Sunday,    // 默认为0
    Monday,    // 默认为1
    Tuesday,   // 默认为2
    Wednesday, // 默认为3
    Thursday,  // 默认为4
    Friday,    // 默认为5
    Saturday   // 默认为6
};

int main() {
   
    // 声明一个Weekday类型的变量
    enum Weekday today = Wednesday;

    // 输出枚举变量的值
    printf("Today is day number: %d\n", today);

    return 0;
}

枚举代码详解

  1. enum Weekday { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };:使用enum关键字定义一个名为Weekday的枚举类型,包含一周七天的值。
  2. enum Weekday today = Wednesday;:声明一个Weekday类型的变量today,并将其值初始化为Wednesday
  3. printf("Today is day number: %d\n", today);:输出枚举变量的值,Wednesday对应的值为3。

通过使用enum关键字,程序员可以定义一组相关的命名常量,增加代码的可读性和可维护性。

示例扩展 3:使用typedef关键字

#include <stdio.h>

// 使用typedef关键字定义一个新类型名称
typedef unsigned int uint;

int main() {
   
    // 使用新类型名称声明变量
    uint age = 25;

    // 输出变量值
    printf("Age: %u\n", age);

    return 0;
}

类型定义代码详解

  1. typedef unsigned int uint;:使用typedef关键字为unsigned int类型定义一个新名称uint
  2. uint age = 25;:使用新定义的类型名称uint声明一个变量age,并将其值初始化为25。
  3. printf("Age: %u\n", age);:输出变量age的值。

通过使用typedef关键字,程序员可以为现有的数据类型定义新的名称,简化代码,提高可读性。

示例扩展 4:使用union关键字

#include <stdio.h>

// 使用union关键字定义一个联合类型
union Data {
   
    int i;
    float f;
    char str[20];
};

int main() {
   
    // 声明一个Data类型的变量
    union Data data;

    // 使用联合体的整数成员
    data.i = 10;
    printf("data.i : %d\n", data.i);

    // 使用联合体的浮点数成员
    data.f = 220.5;
    printf("data.f : %f\n", data.f);

    // 使用联合体的字符串成员
    strcpy(data.str, "C Programming");
    printf("data.str : %s\n", data.str);

    return 0;
}

联合体代码详解

  1. union Data { int i; float f; char str[20]; };:使用union关键字定义一个名为Data的联合体,包含一个整数成员i、一个浮点数成员f和一个字符串成员str
  2. union Data data;:声明一个Data类型的变量data
  3. data.i = 10;:使用联合体的整数成员,并输出其值。
  4. data.f = 220.5;:使用联合体的浮点数成员,并输出其值。
  5. strcpy(data.str, "C Programming");:使用联合体的字符串成员,并输出其值。

通过使用union关键字,程序员可以创建共享相同内存位置的不同数据类型的成员,节省内存空间。

示例扩展 5:使用volatile关键字

#include <stdio.h>

// 声明一个易变变量
volatile int flag = 0;

void check_flag() {
   
    // 检查易变变量的值
    while (flag == 0) {
   
        // 等待flag变为非零
    }
    printf("Flag changed to non-zero value\n");
}

int main() {
   
    // 另一个线程或硬件事件将会改变flag的值
    // 此处仅模拟其变化
    flag = 1;

    check_flag();

    return 0;
}

易变变量代码详解

  1. volatile int flag = 0;:声明一个易变变量flag,告知编译器该变量可能会被其他线程或硬件改变,避免优化导致的问题。
  2. while (flag == 0) {}:检查易变变量的值,等待flag变为非零值。
  3. flag = 1;:模拟另一个线程或硬件事件改变flag的值。
  4. check_flag();:调用检查flag值的函数。

通过使用volatile关键字,程序员可以确保编译器正确处理那些可能在程序之外改变的变量。

示例扩展 6:使用extern关键字

// file1.c
#include <stdio.h>

// 声明外部变量
extern int count;

void write_extern() {
   
    printf("Count is %d\n", count);
}
// file2.c
#include <stdio.h>

// 定义外部变量
int count = 5;

int main() {
   
    // 调用外部函数
    write_extern();
    return 0;
}

外部变量代码详解

  1. extern int count;:在file1.c中声明外部变量count,表示该变量在其他文件中定义。
  2. int count = 5;:在file2.c中定义外部变量count
  3. void write_extern() { printf("Count is %d\n", count); }:在file1.c中定义一个函数write_extern,该函数使用外部变量count
  4. write_extern();:在file2.c中调用write_extern函数,输出外部变量count的值。

通过使用extern关键字,程序员可以在多个文件之间共享变量,提高代码的组织和可维护性。

示例扩展 7:使用static关键字

#include <stdio.h>

// 静态变量声明
static int count = 5;

void func() {
   
    // 静态局部变量
    static int i = 5;
    i++;
    printf("i is %d and count is %d\n", i, count);
}

int main() {
   
    while (count--) {
   
        func();
    }
    return 0;
}

静态变量代码详解

  1. static int count = 5;:声明一个文件范围的静态变量count
  2. static int i = 5;:在函数func内部声明一个静态局部变量i,该变量在函数调用之间保持其值。
  3. i++:每次调用func时,静态局部变量i的值增加1。
  4. while (count--) { func(); }:循环调用函数func,直到count的值减少到0。

通过使用static关键字,程序员可以控制变量的存储期限和作用范围,提高代码的安全性和效率。

示例扩展 8:使用goto关键字

#include <stdio.h>

int main() {
   
    int num = 10;

    // 使用goto跳转到标签
    if (num == 10) {
   
        goto LABEL;
    }

    printf("This will not be printed\n");

LABEL:
    printf("Jumped to label\n");

    return 0;
}

跳转代码详解

  1. if (num == 10) { goto LABEL; }:如果变量num的值为10,跳转到标签LABEL
  2. LABEL::定义一个标签LABEL
  3. printf("This will not be printed\n");:由于使用了goto语句,这行代码不会被执行。
  4. printf("Jumped to label\n");:跳转到标签后,输出相应的文本。

通过使用goto关键字,程序员可以在程序中实现无条件跳转,但应慎用,以避免代码难以维护和理解。

示例扩展 9:使用break和continue关键字

#include <stdio.h>

int main() {
   
    int i;

    // 使用break关键字
    for (i = 0; i < 10; i++) {
   
        if (i == 5) {
   
            break; // 退出循环
        }
        printf("i is %d\n", i);
    }

    printf("Exited loop when i is 5\n");

    // 使用continue关键字
    for (i = 0; i < 10; i++) {
   
        if (i == 5) {
   
            continue; // 跳过当前循环迭代
        }
        printf("i is %d\n", i);
    }

    return 0;
}

循环控制代码详解

  1. if (i == 5) { break; }:当变量i的值为5时,使用break关键字退出循环。
  2. if (i == 5) { continue; }:当变量i的值为5时,使用continue关键字跳过当前循环迭代,继续下一次迭代。

通过使用breakcontinue关键字,程序员可以更灵活地控制循环的执行流程。

示例扩展 10:使用do-while循环

#include <stdio.h>

int main() {
   
    int i = 0;

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

    return 0;
}

do-while循环代码详解

  1. do { ... } while (i < 5);:使用do-while循环结构,确保循环体至少执行一次。每次循环结束时,检查条件i < 5,如果条件为真,则继续循环。

通过使用do-while关键字,程序员可以确保循环体至少执行一次,即使条件在第一次检查时为假。

这些示例展示了C语言关键字的多样性和灵活性,通过合理使用这些关键字,程序员可以编写高效、可维护的程序。

示例扩展 11:使用const关键字

#include <stdio.h>

int main() {
   
    // 使用const关键字声明常量
    const int max_value = 100;

    // 试图修改常量会导致编译错误
    // max_value = 200;

    printf("The maximum value is %d\n", max_value);

    return 0;
}

常量代码详解

  1. const int max_value = 100;:使用const关键字声明一个整数常量max_value,并初始化为100。
  2. // max_value = 200;:试图修改常量max_value会导致编译错误,因为const关键字指定变量不可修改。
  3. printf("The maximum value is %d\n", max_value);:输出常量max_value的值。

通过使用const关键字,程序员可以定义不可修改的变量,确保代码的安全性和稳定性。

示例扩展 12:使用sizeof关键字

#include <stdio.h>

int main() {
   
    int a;
    float b;
    double c;
    char d;

    // 使用sizeof关键字获取数据类型的大小
    printf("Size of int: %zu bytes\n", sizeof(a));
    printf("Size of float: %zu bytes\n", sizeof(b));
    printf("Size of double: %zu bytes\n", sizeof(c));
    printf("Size of char: %zu bytes\n", sizeof(d));

    return 0;
}

数据大小代码详解

  1. sizeof(a):使用sizeof关键字获取整数变量a的大小。
  2. sizeof(b):使用sizeof关键字获取浮点数变量b的大小。
  3. sizeof(c):使用sizeof关键字获取双精度浮点数变量c的大小。
  4. sizeof(d):使用sizeof关键字获取字符变量d的大小。

通过使用sizeof关键字,程序员可以在编译时获取数据类型或变量的大小,以便进行内存管理和优化。

示例扩展 13:使用typedef关键字

#include <stdio.h>

// 使用typedef关键字定义新的类型名称
typedef unsigned long ulong;
typedef int (*func_ptr)(int, int);

int add(int a, int b) {
   
    return a + b;
}

int main() {
   
    // 使用新类型名称声明变量
    ulong big_number = 1000000;
    func_ptr fptr = add;

    // 输出变量值
    printf("Big number: %lu\n", big_number);
    printf("Result of add function: %d\n", fptr(2, 3));

    return 0;
}

类型定义代码详解

  1. typedef unsigned long ulong;:使用typedef关键字为unsigned long类型定义新的名称ulong
  2. typedef int (*func_ptr)(int, int);:使用typedef关键字为函数指针类型定义新的名称func_ptr
  3. ulong big_number = 1000000;:使用新定义的类型名称ulong声明一个变量big_number,并初始化为1000000。
  4. func_ptr fptr = add;:使用新定义的类型名称func_ptr声明一个函数指针变量fptr,并初始化为函数add的地址。
  5. printf("Big number: %lu\n", big_number);:输出变量big_number的值。
  6. printf("Result of add function: %d\n", fptr(2, 3));:通过函数指针fptr调用函数add,并输出结果。

通过使用typedef关键字,程序员可以为现有的数据类型和复杂的类型定义新的名称,简化代码,提高可读性。

示例扩展 14:使用volatile关键字

#include <stdio.h>
#include <pthread.h>

volatile int flag = 0;

void* thread_func(void* arg) {
   
    // 修改易变变量
    flag = 1;
    printf("Thread: flag set to 1\n");
    return NULL;
}

int main() {
   
    pthread_t thread;

    // 创建新线程
    pthread_create(&thread, NULL, thread_func, NULL);

    // 等待flag变为非零
    while (flag == 0);

    printf("Main: flag changed to %d\n", flag);

    // 等待线程结束
    pthread_join(thread, NULL);

    return 0;
}

多线程代码详解

  1. volatile int flag = 0;:声明一个易变变量flag,告知编译器该变量可能会被其他线程改变,避免优化导致的问题。
  2. void* thread_func(void* arg) { flag = 1; printf("Thread: flag set to 1\n"); return NULL; }:在新线程中修改易变变量flag的值。
  3. pthread_create(&thread, NULL, thread_func, NULL);:创建新线程,执行thread_func函数。
  4. while (flag == 0);:在主线程中等待易变变量flag的值变为非零。
  5. printf("Main: flag changed to %d\n", flag);:输出易变变量flag的值。

通过使用volatile关键字,程序员可以确保编译器正确处理那些可能在程序之外改变的变量。

这些示例展示了C语言关键字的多样性和灵活性,通过合理使用这些关键字,程序员可以编写高效、可维护的程序。

示例扩展 15:使用switch关键字

#include <stdio.h>

int main() {
   
    int num = 2;

    // 使用switch多分支选择语句
    switch (num) {
   
        case 1:
            printf("Number is 1\n");
            break;
        case 2:
            printf("Number is 2\n");
            break;
        case 3:
            printf("Number is 3\n");
            break;
        default:
            printf("Number is not 1, 2, or 3\n");
            break;
    }

    return 0;
}

switch语句代码详解

  1. switch (num):多分支选择语句,检查变量num的值。
  2. case 1: ... break;:如果num的值为1,执行相应的代码块,然后使用break关键字退出switch语句。
  3. case 2: ... break;:如果num的值为2,执行相应的代码块,然后使用break关键字退出switch语句。
  4. case 3: ... break;:如果num的值为3,执行相应的代码块,然后使用break关键字退出switch语句。
  5. default: ... break;:如果num的值不匹配任何一个case,执行default代码块,然后使用break关键字退出switch语句。

通过使用switch关键字,程序员可以实现多分支选择逻辑,提高代码的可读性和效率。

示例扩展 16:使用union关键字和typedef关键字结合

#include <stdio.h>

// 使用typedef和union关键字定义新的联合类型名称
typedef union {
   
    int i;
    float f;
    char str[20];
} Data;

int main() {
   
    // 声明一个Data类型的变量
    Data data;

    // 使用联合体的整数成员
    data.i = 10;
    printf("data.i : %d\n", data.i);

    // 使用联合体的浮点数成员
    data.f = 220.5;
    printf("data.f : %f\n", data.f);

    // 使用联合体的字符串成员
    strcpy(data.str, "C Programming");
    printf("data.str : %s\n", data.str);

    return 0;
}

联合体和类型定义代码详解

  1. typedef union { int i; float f; char str[20]; } Data;:使用typedefunion关键字定义一个新的联合类型名称Data
  2. Data data;:使用新定义的类型名称Data声明一个变量data
  3. data.i = 10;:使用联合体的整数成员,并输出其值。
  4. data.f = 220.5;:使用联合体的浮点数成员,并输出其值。
  5. strcpy(data.str, "C Programming");:使用联合体的字符串成员,并输出其值。

通过结合使用typedefunion关键字,程序员可以简化类型定义,提高代码的可读性和维护性。

示例扩展 17:使用struct关键字和typedef关键字结合

#include <stdio.h>

// 使用typedef和struct关键字定义新的结构体类型名称
typedef struct {
   
    int x;
    int y;
} Point;

int main() {
   
    // 声明一个Point类型的变量,并初始化
    Point p1 = {
   10, 20};

    // 输出结构体成员
    printf("Point p1: x = %d, y = %d\n", p1.x, p1.y);

    return 0;
}

结构体和类型定义代码详解

  1. typedef struct { int x; int y; } Point;:使用typedefstruct关键字定义一个新的结构体类型名称Point
  2. Point p1 = {10, 20};:使用新定义的类型名称Point声明一个变量p1,并初始化其成员x为10,y为20。
  3. printf("Point p1: x = %d, y = %d\n", p1.x, p1.y);:输出结构体成员的值。

通过结合使用typedefstruct关键字,程序员可以简化类型定义,提高代码的可读性和维护性。

示例扩展 18:使用for循环

#include <stdio.h>

int main() {
   
    int i;

    // 使用for循环
    for (i = 0; i < 5; i++) {
   
        printf("i is %d\n", i);
    }

    return 0;
}

for循环代码详解

  1. for (i = 0; i < 5; i++) { ... }:使用for循环结构,初始化变量i为0,每次迭代i增加1,直到i不小于5。
  2. printf("i is %d\n", i);:在每次循环中输出变量i的值。

通过使用for循环,程序员可以简洁地实现重复执行的代码,提高程序的效率和可读性。

示例扩展 19:使用while循环

#include <stdio.h>

int main() {
   
    int i = 0;

    // 使用while循环
    while (i < 5) {
   
        printf("i is %d\n", i);
        i++;
    }

    return 0;
}

while循环代码详解

  1. while (i < 5) { ... }:使用while循环结构,检查条件i < 5,如果条件为真,则执行循环体。
  2. printf("i is %d\n", i);:在每次循环中输出变量i的值。
  3. i++;:在每次循环后增加变量i的值。

通过使用while循环,程序员可以实现基于条件的循环,提高代码的灵活性和可读性。

示例扩展 20:使用宏定义

#include <stdio.h>

#define PI 3.14159
#define CIRCLE_AREA(radius) (PI * (radius) * (radius))

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

    // 使用宏计算圆的面积
    area = CIRCLE_AREA(radius);
    printf("Area of circle with radius %d is %f\n", radius, area);

    return 0;
}

宏定义代码详解

  1. #define PI 3.14159:定义一个名为PI的宏,值为3.14159。
  2. #define CIRCLE_AREA(radius) (PI * (radius) * (radius)):定义一个名为CIRCLE_AREA的宏,计算圆的面积。
  3. area = CIRCLE_AREA(radius);:使用CIRCLE_AREA宏计算半径为5的圆的面积,并将结果赋值给变量area
  4. printf("Area of circle with radius %d is %f\n", radius, area);:输出圆的面积。

通过使用宏定义,程序员可以创建常量和简单的函数,提高代码的可读性和效率。

这些示例展示了C语言关键字和宏定义的多样性和灵活性,通过合理使用这些关键字和宏定义,程序员可以编写高效、可维护的程序。

示例扩展 21:使用inline关键字

#include <stdio.h>

// 使用inline关键字定义内联函数
inline int square(int x) {
   
    return x * x;
}

int main() {
   
    int num = 5;
    int result;

    // 调用内联函数
    result = square(num);
    printf("Square of %d is %d\n", num, result);

    return 0;
}

内联函数代码详解

  1. inline int square(int x) { return x * x; }:使用inline关键字定义一个内联函数square,计算整数x的平方。
  2. result = square(num);:调用内联函数square,并将结果赋值给变量result
  3. printf("Square of %d is %d\n", num, result);:输出num的平方值。

通过使用inline关键字,程序员可以建议编译器将函数调用展开为内联代码,从而减少函数调用的开销,提高程序的执行效率。

示例扩展 22:使用restrict关键字

#include <stdio.h>

// 使用restrict关键字声明指针
void add_vectors(int *restrict a, int *restrict b, int *restrict result, int n) {
   
    for (int i = 0; i < n; i++) {
   
        result[i] = a[i] + b[i];
    }
}

int main() {
   
    int n = 5;
    int a[5] = {
   1, 2, 3, 4, 5};
    int b[5] = {
   10, 20, 30, 40, 50};
    int result[5];

    // 调用函数
    add_vectors(a, b, result, n);

    // 输出结果
    for (int i = 0; i < n; i++) {
   
        printf("result[%d] = %d\n", i, result[i]);
    }

    return 0;
}

限定指针代码详解

  1. void add_vectors(int *restrict a, int *restrict b, int *restrict result, int n):使用restrict关键字声明指针abresult,告知编译器这些指针指向的内存区域不重叠。
  2. result[i] = a[i] + b[i];:逐元素将向量a和向量b相加,并将结果存储在向量result中。
  3. for (int i = 0; i < n; i++) { printf("result[%d] = %d\n", i, result[i]); }:输出向量result的每个元素。

通过使用restrict关键字,程序员可以告知编译器指针指向的内存区域不重叠,从而允许编译器进行更激进的优化,提高程序的性能。

示例扩展 23:使用volatile和const关键字结合

#include <stdio.h>

const volatile int threshold = 100;

void check_threshold(int value) {
   
    if (value > threshold) {
   
        printf("Value %d exceeds the threshold %d\n", value, threshold);
    } else {
   
        printf("Value %d is within the threshold %d\n", value, threshold);
    }
}

int main() {
   
    int value = 120;

    // 检查值是否超过阈值
    check_threshold(value);

    return 0;
}

易变常量代码详解

  1. const volatile int threshold = 100;:声明一个易变常量threshold,告知编译器该变量不可修改,但可能会被外部因素改变。
  2. void check_threshold(int value) { ... }:定义一个函数check_threshold,检查输入值value是否超过阈值threshold
  3. check_threshold(value);:调用函数check_threshold,并输出结果。

通过结合使用volatileconst关键字,程序员可以定义不可修改但可能被外部因素改变的变量,确保编译器正确处理这些变量。

示例扩展 24:使用_Alignas和_Alignof关键字

#include <stdio.h>
#include <stdalign.h>

struct Data {
   
    char c;
    _Alignas(double) char d;
};

int main() {
   
    struct Data data;

    printf("Alignment of char: %zu\n", alignof(char));
    printf("Alignment of double: %zu\n", alignof(double));
    printf("Alignment of data.d: %zu\n", alignof(data.d));

    return 0;
}

对齐代码详解

  1. struct Data { char c; _Alignas(double) char d; };:定义一个结构体Data,并使用_Alignas关键字将成员d的对齐方式设置为double类型的对齐方式。
  2. printf("Alignment of char: %zu\n", alignof(char));:输出char类型的对齐要求。
  3. printf("Alignment of double: %zu\n", alignof(double));:输出double类型的对齐要求。
  4. printf("Alignment of data.d: %zu\n", alignof(data.d));:输出data.d的对齐要求。

通过使用_Alignas_Alignof关键字,程序员可以控制和查询变量的对齐方式,从而优化内存访问,提高程序的性能。

示例扩展 25:使用_Bool关键字

#include <stdio.h>
#include <stdbool.h>

int main() {
   
    _Bool flag1 = 1;
    bool flag2 = false;

    printf("flag1 is %d\n", flag1);
    printf("flag2 is %d\n", flag2);

    if (flag1) {
   
        printf("flag1 is true\n");
    }

    if (!flag2) {
   
        printf("flag2 is false\n");
    }

    return 0;
}

布尔类型代码详解

  1. _Bool flag1 = 1;:使用_Bool关键字声明一个布尔变量flag1,并初始化为1(真)。
  2. bool flag2 = false;:使用stdbool.h头文件中的bool类型声明一个布尔变量flag2,并初始化为false(假)。
  3. printf("flag1 is %d\n", flag1);:输出flag1的值。
  4. printf("flag2 is %d\n", flag2);:输出flag2的值。
  5. if (flag1) { ... }:检查flag1是否为真,并输出相应的文本。
  6. if (!flag2) { ... }:检查flag2是否为假,并输出相应的文本。

通过使用_Bool关键字和stdbool.h头文件,程序员可以在C语言中方便地处理布尔类型的数据。

这些示例展示了C语言关键字的多样性和灵活性,通过合理使用这些关键字,程序员可以编写高效、可维护的程序。

6. 参考文献

  1. Kernighan, B. W., & Ritchie, D. M. (1988). The C Programming Language (2nd ed.). Prentice Hall.
  2. ISO/IEC. (1999). ISO/IEC 9899:1999. Programming Languages – C.
  3. ISO/IEC. (2024). ISO/IEC DIS 9899. Programming Languages – C.
  4. Harbison, S. P., & Steele, G. L. (2002). C: A Reference Manual (5th ed.). Prentice Hall.

7. 结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对C语言中的关键字有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持
目录
相关文章
|
5天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
21天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
25天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
16天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
11599 12
|
10天前
|
人工智能 自然语言处理 前端开发
100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP
打开手机,录制下你完成的代码效果,发布到你的社交媒体,前 100 个@玺哥超Carry、@通义灵码的粉丝,可以免费获得一个降噪蓝牙耳机。
4093 14
|
17天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。
6853 10
|
29天前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
15天前
|
人工智能 自然语言处理 前端开发
什么?!通义千问也可以在线开发应用了?!
阿里巴巴推出的通义千问,是一个超大规模语言模型,旨在高效处理信息和生成创意内容。它不仅能在创意文案、办公助理、学习助手等领域提供丰富交互体验,还支持定制化解决方案。近日,通义千问推出代码模式,基于Qwen2.5-Coder模型,用户即使不懂编程也能用自然语言生成应用,如个人简历、2048小游戏等。该模式通过预置模板和灵活的自定义选项,极大简化了应用开发过程,助力用户快速实现创意。
|
3天前
|
机器学习/深度学习 人工智能 安全
通义千问开源的QwQ模型,一个会思考的AI,百炼邀您第一时间体验
Qwen团队推出新成员QwQ-32B-Preview,专注于增强AI推理能力。通过深入探索和试验,该模型在数学和编程领域展现了卓越的理解力,但仍在学习和完善中。目前,QwQ-32B-Preview已上线阿里云百炼平台,提供免费体验。
|
11天前
|
人工智能 C++ iOS开发
ollama + qwen2.5-coder + VS Code + Continue 实现本地AI 辅助写代码
本文介绍在Apple M4 MacOS环境下搭建Ollama和qwen2.5-coder模型的过程。首先通过官网或Brew安装Ollama,然后下载qwen2.5-coder模型,可通过终端命令`ollama run qwen2.5-coder`启动模型进行测试。最后,在VS Code中安装Continue插件,并配置qwen2.5-coder模型用于代码开发辅助。
760 5