浅谈const在C语言和C++的区别

在很多的人的普遍印象中,用const修饰符修饰的变量表示该变量是常量,是只读的,无法修改的。其实对于这样的回答,是不准确的。

在C语言中的const
在C语言中,用const修饰的变量,其本质上还是个变量,只是它不允许作为左值存在,也就是不法对该变量进行直接赋值修改该变量,但是这不意味着该变量的值就无法修改。下面我们看一下这段代码:


#include<stdio.h>
int main()
{

    const int a = 10;
    int b = 10;
    int* p = (int*)&a;
    *p = 100;
    b = a;
    printf("a=%d b=%d *p=%d\n",a,b,*p);
    return 0;
}

使用vs2019的平台来进行编译从这个结果中我们也可以看出,const修饰的变量的值在C语言中并非是无法修改的,我们可以通过指针来修改该变量的值。

在C++中的const 为了兼容C语言,C++也保留了const的很多属性。
但是在C++中,const这个修饰符和在C语言中有点不同


#include<stdio.h>
int main()
{

#ifdef __Cplusplus
    printf("C++");
#endif
    const int a = 10;
    int b = 10;
    int* p = (int*)&a;
    *p = 100;
    b = a;
    printf("a=%d b=%d *p=%d\n",a,b,*p);
    return 0;
}

使用vs2019的平台来进行编译

 

 

相同的代码,用C语言和C++编译器编译运行后得到的结果却不相同。
其实在C++中 ,在编译的时候,当碰到用const修饰的变量时,编译器是直接将变量的值和变量的符号对应起来一起存到符号表中,例如const int a = 5;在符号表中就会将a和5对应起来,在编译的过程中。

当碰到printf(“a = %d\n”,a); 时,为用 5 直接将 a 替换掉。在C++中,编译器不会为a分配存储空间,在C语言中就会为a分配存储空间,所以在C编译器中,就可以通过指针来改变用const修饰的变量。

我们再看一下下面的代码:

#include <stdio.h>

int main()
{
    const int a = 5;
    int* p = (int*)&a;
    
    printf("a = %d\n",a);
    
    *p = 10;
    printf("a = %d\n",a);
    printf("*p = %d\n",*p);
    printf("&a = %p\n",&a);
    printf("p = %p\n",p);

    return 0;    
}


我们只是在代码中打印了指着p和a的地址,用C语言和C++的编译器编译执行之后,打印出来的地址p和a都是相同的。可能会有疑惑 在C++中不是说不会为a分配地址吗?怎么执行后地址p和a都是相同的?

在C语言中,C编译器会为const修饰的变量分配空间,所以能打印地址和修改值大家都理解,那么在C++中呢?

在C++中,编译器不会为const变量分配空间,只会将其对应起来存到符号表中,用到变量名的时候,直接将值替换。但是在碰到int* p = (int*)&a; 这条语句的时候,在碰到 &a 时,这个时候会为 a 分配存储空间,这个时候 p 和 a 的地址相同,但是通过指针来修改a的值在C++中还是无法成功的,因为在碰到 printf(“a = %d\n”,a); 时,编译器还是会直接用 5 将 a 替换,而不会去分配的存储空间的取值。

其实在C++中,const修饰的变量,在编译的时候如果前面有extern和取地址符 & 时,会为变量分配存储空间是为了兼容C语言,但是在C++中,用const修饰的变量就真的无法修改它的值,可以说是常亮。但是在C语言中,const修饰的变量本质上还是变量而不是常量。这在C语言中其实也是矛盾的,因为我们想要用const定义一个常量,但又可以通过指针来改变该常量的值。而C++为了兼容C语言,所以保留了这个特性,但是却无法修改它的值,这就是const在C语言和C++中的区别。
 

在Python中,lstrip()方法用于删除字符串开头的指定字符,默认情况下是删除空格字符。如果想要将Python的lstrip()方法转换成C语言中的对应函数,可以使用C语言中的strspn()函数来实现类似的功能。 在C语言中,strspn()函数用于计算字符串中连续包含指定字符集合中的字符的数量。通过将要删除的字符集合作为参数传递给strspn()函数,可以获取到字符串开头连续包含这些字符的数量,然后再通过移动指针的方式将这些字符删除。 以下是一个示例代码,展示了如何实现将Python的lstrip()方法转换成C语言中的对应函数: ```c #include <stdio.h> #include <string.h> void lstrip(char *str, const char *chars) { int i = 0; while (str[i != '\0' && strchr(chars, str[i])) { i++; } memmove(str, str + i, strlen(str) - i + 1); } int main() { char str[] = " hello world "; const char chars[] = " "; lstrip(str, chars); printf("%s\n", str); // 输出: "hello world " return 0; } ``` 以上代码定义了一个名为lstrip()的函数,该函数接受两个参数:一个指向要处理的字符串的指针一个指向要删除的字符集合的指针。通过使用strchr()函数在字符串中查找字符,然后使用memmove()函数将字符串中的字符向前移动,实现了删除开头指定字符的功能。最后,我们可以调用lstrip()函数并打印结果来验证转换结果。 请注意,此代码仅为示例,你可以根据自己的需求进行修改扩展。同时,记得在使用C语言时要小心处理字符串的边界情况,以避免内存访问错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [浅谈python中截取字符函数strip,lstrip,rstrip](https://download.youkuaiyun.com/download/weixin_38703468/12876430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python中的lstrip()方法使用简介](https://blog.youkuaiyun.com/weixin_39595085/article/details/110536866)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C/C++python中的字符串](https://blog.youkuaiyun.com/weixin_39861267/article/details/124154980)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值