auto、break、case、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、inline、int、long、register、restrict、return、short、signed、sizeof、static、struct、switch、typedef、union、unsigned、void、volatile、while、_Alignas、_Alignof、_Atomic、_Bool、_Complex、_Generic、_Imaginary、_Noreturn、_Static_assert、_Thread_local
C18关键字:
auto、break、case、char、const、
continue、default、do、double、else、
enum、extern、float、for、goto、
if、inline、int、long、register、
restrict、return、short、signed、sizeof、
static、struct、switch、typedef、union、
unsigned、void、volatile、while、_Alignas、
_Alignof、_Atomic、_Bool、_Complex、_Generic、
_Imaginary、_Noreturn、_Static_assert、_Thread_local
运算符:
1. 算术运算符:+、-、*、/、%(加、减、乘、除、取模)
2. 关系运算符:>、<、>=、<=、==、!=(大于、小于、大于等于、小于等于、等于、不等于)
3. 逻辑运算符:&&、||、!(与、或、非)
4. 位运算符:&、|、^、~、<<、>>(按位与、按位或、按位异或、按位取反、左移、右移)
5. 赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=(赋值、加等于、减等于、乘等于、除等于、取模等于、按位与等于、按位或等于、按位异或等于、左移等于、右移等于)
6. 条件运算符:? :(三目运算符)
7. 其他运算符:sizeof(返回变量或数据类型的大小)、&(返回变量的地址)、*(指针变量声明时使用,表示指向某个地址的指针)
连接运算符:
##是连接运算符,它可以将两个标识符连接成一个新的标识符。
#define NAME(x) name_##x
#define VAR(x) int var_##x
那么在使用时,可以这样写:
NAME(1) // 等价于 name_1
VAR(2) // 等价于 int var_2
特殊操作:
C18编译器是C语言的一种编译器,它具有一些特殊的操作,包括:
1. __asm:用于嵌入汇编代码。
2. __attribute__:用于指定变量或函数的属性,如对齐方式、可重入性等。
3. __interrupt:用于定义中断服务函数。
4. __far和__near:用于指定变量或函数的存储类型,如远程存储、近程存储等。
5. __packed:用于指定结构体或联合体的对齐方式,使其紧凑排列。
6. __data16和__code16:用于指定数据或代码的段地址为16位。
7. __generic:用于定义泛型函数。
关键字作用:
sizeof //获取对象占用内存字节数,用法 int big = sizeof(int);
类型//内存占用字节
值类型
double
float
int
字符型
char
用户类型
enum
struct
union
修饰
auto
const
extern
long
register
short
signed
unsigned
void
volatile
restrict
static、switch、typedef、while、_Alignas、_Alignof、_Atomic、_Bool、_Complex、_Generic、_Imaginary、_Noreturn、_Static_assert、_Thread_local
C18如何输出变量的名字:
#define STR(x) #x
#define PRINT_VAR_NAME(x) printf("变量名为:%s\n", STR(x))
int main() {
int a = 10;
PRINT_VAR_NAME(a); // 输出:变量名为:a
return 0;
}
字符串名启动同名函数:
在C语言中,可以通过函数指针来实现通过字符串名启动同名函数的功能。具体实现步骤如下:
1. 定义函数指针类型,例如:
```
typedef void (*FuncPtr)(void);
```
2. 定义同名函数,例如:
```
void func1(void) {
printf("This is func1.\n");
}
void func2(void) {
printf("This is func2.\n");
}
```
3. 将同名函数的函数指针存储到一个哈希表中,例如:
```
#define MAX_FUNC_NUM 10
static const char* func_names[MAX_FUNC_NUM] = {"func1", "func2"};
static FuncPtr func_ptrs[MAX_FUNC_NUM] = {func1, func2};
static int hash(const char* str) {
int hash_val = 0;
while (*str) {
hash_val = (hash_val << 5) + *str++;
}
return hash_val;
}
static FuncPtr get_func_ptr(const char* func_name) {
int index = hash(func_name) % MAX_FUNC_NUM;
if (strcmp(func_names[index], func_name) == 0) {
return func_ptrs[index];
}
return NULL;
}
```
4. 通过字符串名获取同名函数的函数指针,并调用该函数,例如:
```
const char* func_name = "func1";
FuncPtr func_ptr = get_func_ptr(func_name);
if (func_ptr != NULL) {
(*func_ptr)();
}
```