C语言学习笔记1-隐式转换&string接口&volatile

C语言中string操作常用接口

函数名功能描述返回值
strcpy(char *dest, const char *src)将 src 指向的字符串复制到 dest 指向的字符数组中,以 \0 结尾dest 指针
strncpy(char *dest, const char *src, size_t n)将 src 指向的字符串的前 n 个字符复制到 dest 指向的字符数组中,以 \0 结尾或者补充 \0 直到 n 个字符dest 指针
strlen(const char *str)返回 str 指向的字符串的长度,不包括最后的 \0字符串长度,类型为 size_t
strcmp(const char *s1, const char *s2)比较两个字符串 s1 和 s2,返回整数表示它们之间的大小关系,相等为 0,s1 大于 s2 为正数,s1 小于 s2 为负数整数,表示字符串的大小关系
strncmp(const char *s1, const char *s2, size_t n)比较两个字符串 s1 和 s2 的前 n 个字符,返回整数表示它们之间的大小关系,相等为 0,s1 大于 s2 为正数,s1 小于 s2 为负数整数,表示字符串的大小关系

隐式转换

C语言中的隐式转换

在C语言中,有许多情况下会发生隐式类型转换。以下列举一些常见的隐式转换情况:

  • 整数提升:当一个小于int的整数类型参与运算时,它们会自动转换成int类型。例如,char类型和short类型在表达式中参与运算时,就会自动提升为int类型。
  • 算术类型转换:当两个不同的算术类型进行运算时,它们会被转换成同一类型。转换规则为:如果两个类型的位数相同,则转换成无符号类型;如果两个类型的位数不同,则转换成位数较大的类型。
  • 浮点数提升:当一个float类型参与运算时,它会自动转换成double类型。
  • 函数指针转换:函数名在大多数情况下会自动转换成指向函数的指针。
  • 枚举类型转换:枚举类型可以隐式转换成整数类型。
  • 指针类型转换:可以将一个void指针隐式转换成任意其他类型的指针。

C++中的隐式转换

C++的隐式转换与C语言类似,但有以下一些区别:

  • bool类型:C++中可以将非零值隐式转换成true,将零值隐式转换成false。
  • const类型:C++中可以将一个const对象隐式转换成非const对象,但不能将非const对象隐式转换成const对象。
  • 类类型转换:C++中可以定义类型转换构造函数和类型转换运算符,从而可以实现自定义类型的隐式转换。
  • 派生类转换:C++中可以将指向派生类对象的指针隐式转换成指向基类对象的指针,但不能将指向基类对象的指针隐式转换成指向派生类对象的指针。

枚举类型转换

以下是C语言中枚举类型的隐式转换示例:

#c
Copy code
enum color { RED, GREEN, BLUE }; 
enum color c = GREEN; 
int i = c; // 隐式将枚举类型转换成整数类型 

在上述示例中,将枚举类型转换成整数类型是合法的。

函数指针转换

以下是C语言中函数指针的隐式转换示例:

#c
Copy code
void foo() {} 
void (*pFoo)() = foo; // 将函数名转换成指向函数的指针 

在上述示例中,函数名foo被隐式转换成指向函数的指针pFoo。

总结

C语言和C++语言中都存在隐式类型转换的情况,开发者在使用中需要注意隐式类型转换可能导致编译出错

在C语言中,枚举类型是一种用户自定义类型,它的定义方式类似于结构体。枚举类型是由一组标识符组成的,这些标识符是由用户定义的。枚举类型的主要作用是为程序中的某些数据提供有意义的名字,从而使程序更加易读易懂。

枚举

枚举的定义

在C语言中,定义枚举类型需要使用关键字enum。枚举类型的一般形式如下:

c

Copy code
enum 枚举类型名 {     标识符1,     标识符2,     ...     标识符n }; 

其中,枚举类型名是用户定义的枚举类型名称,标识符1标识符n是用户定义的枚举成员,它们表示了枚举类型中的各个取值。每个枚举成员都会被隐式地赋予一个整数值,其默认值从0开始依次递增。用户也可以为枚举成员显式地指定值,如下所示:

c

Copy code
enum weekday {     MON = 1,     TUE,     WED,     THU,     FRI,     SAT,     SUN }; 

上面的代码定义了一个枚举类型weekday,它有7个枚举成员,分别代表一周的7天。其中,第一个成员MON的值为1,后面的成员依次递增。

枚举的初始化

枚举类型变量可以用枚举成员来进行初始化,也可以用整数值来进行初始化。如果用整数值来初始化枚举类型变量,需要保证该值是合法的枚举成员值。

c

Copy code
enum color { RED, GREEN, BLUE }; enum color c1 = RED;   // 使用枚举成员初始化 enum color c2 = 1;     // 使用整数值初始化 

枚举的使用

枚举类型变量可以用来定义函数的参数和返回值,也可以用来定义结构体和共用体的成员。

作为函数参数和返回值

c

Copy code
enum color { RED, GREEN, BLUE };  enum color mix(enum color c1, enum color c2) {     if (c1 == RED && c2 == GREEN || c1 == GREEN && c2 == RED) {         return YELLOW;     } else if (c1 == RED && c2 == BLUE || c1 == BLUE && c2 == RED) {         return MAGENTA;     } else if (c1 == GREEN && c2 == BLUE || c1 == BLUE && c2 == GREEN) {         return CYAN;     } else {         return c1;     } } 

上面的代码定义了一个枚举类型color,然后定义了一个函数mix,它接受两个color类型的参数,并返回一个color类型的值。

Volatile

volatile关键字的一些常见功能和用法

  1. 防止编译器优化
    由于编译器在优化代码时会尝试将一些变量缓存到CPU寄存器中,以提高程序的执行效率,因此在某些情况下可能会导致程序输出结果与预期不符。使用volatile关键字可以告诉编译器,不要对该变量进行优化,而是每次都从内存中读取变量的值,以确保程序的正确性。

  2. 处理多线程共享变量
    在多线程编程中,如果多个线程共享同一个变量,可能会导致变量值的不一致性,从而产生各种问题。使用volatile关键字可以告诉编译器,该变量可能被其他线程修改,因此在访问该变量时需要加锁或其他同步机制,以保证线程安全。

  3. 处理外部设备或中断
    在嵌入式系统或其他需要与外部设备或中断交互的系统中,使用volatile关键字可以确保程序正确地处理外部事件。由于外部设备或中断可能随时修改变量的值,因此需要使用volatile关键字来告诉编译器,在访问该变量时需要从内存中读取最新的值,以保证程序的正确性。

#include <stdio.h>

int main()
{
    volatile int num = 10;
    int result;

    // 第一个线程修改num的值
    num = 20;

    // 第二个线程读取num的值
    result = num;

    printf("num = %d, result = %d\n", num, result);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值