目录
从这篇文章开始就要说一个新的系列,关于C语言的错误和陷阱,由于C++是向前兼容的,所以语言的陷阱也会在C++上出现,所以我们来梳理一遍,防止自己掉坑,顺便会说说C++的在这些陷阱的改进方法。
插话:
首先我们先来了解一个概念,那就是C语言中的双引号和单引号的含义,为后面地内容做铺垫。
在C++中,单引号和双引号的主要区别在于它们表示的数据类型和用途不同。单引号用于表示字符(char类型),而双引号用于表示字符串(string类型)。
单引号:单引号用于表示一个字符,它只能包含一个字符。例如, 'a'表示字符'a'。在内存中,单引号表示的字符占一个字节的空间,并且不会自动添加结束符\0'。因此,单引号主要用于表示单个字符常量。
双引号:双引号用于表示一个字符串,可以包含多个字符。例如,"hello"表示字符串"hello"。在内存中,双引号表示的字符串会占用多个字节的空间,并且会在字符串的末尾自动添加结束符'\0'。所以"hello"表达的就是'hello'和'\0'。因此,双引号主要用于表示字符串常量。
这就是单双引号的区别,接下来开始正文。
字符语法的陷阱
1.陷阱
- char c1='no';
- char c2=''no'';
- const char*s="!"
- const char*s2='!'
观察上面四个式子,思考哪几个是正确的。
答案揭晓:1和3是正确的,2和4是错误的,你答对了吗?
接下来我们就来刨析一下为什么一个单引号,一个双引号是正确答案。
2.解析
首先我们将上面的实例分成两组,一组是1和2,另一组是3和4。
在开篇我们就知道了单引号和双引号的区别,其中单引号表示的是一个字符,双引号表示的是一个字符串,所以你想到为什么单引号可以了吗?其实就是因为char型的变量是字符而不是字符串。实例1和2的唯一区别就是赋值的值不同,示例一是字符可以对应char型变量,示例二的字符串就不能赋值给char型的变量,这就是原因。(如果对数据类型有不清楚的地方,看我之前的文章)
还有就是虽然单引号表示的字符串可以赋值给char型的变量,但是由于单引号表示的是字符,而表示的字符串在赋值的时候就会出现截断现象(将字符串截断,用其中的一个字符来赋值给char型变量),比如例子中的'no'就会将o赋值给c1,这就是截断。但是截断与编译器也是相关的,因为不同的编译器截断的部分不同,有的编译器会将n截断赋值给变量,有的编译器会将o截断赋值给变量,但是截断的原理都是相同的只是方式不同。
接下来就是第二组的解析;
第二组的两个例子是指针相关的(后面会详细讲到),那么为什么三号是对的,四号却是错的呢?
首先我们要知道指针一般指向的都是地址,所以赋值给指针的值就很重要。而双引号可以表示一个字符串,且可以开辟一个空间存储字符串,且字符串可以看作是字符数组,那么字符串就有一个地址符可以直接表示这个字符串(不是字符串的单个字母,是整体)其实就是相当于单元号,字符串相当于一个单元,字符就是这个单元的个体,而单元号就可以表示所有单元的地址(后面说数组的时候还会再次解答)。所以含双引号的字符串在使用的过程中的值是这些字符串的地址而不是这些字符本身,所以双引号可以赋值给指针。而单引号不能赋值给指针,因为他表示单个字符,无法返回地址。
补充:
'\0'是字符串的结束符,任何字符串之后都会自动加上'\0'。如果字符串末尾少了‘\0’转义字符,则其在输出时可能会出现乱码问题。
‘\0’转义字符在ASCII表中并不表示阿拉伯数字0,阿拉伯数字0的ASCII码为48,‘\0’转义字符的ASCII码值为0,它表示的是ASCII控制字符中空字符的含义。字符串与数组的关系也是紧密相连的,在后面将数组的时候会详细解答这其中的关系。
改进:
为了避免c++中出现C的错误,掉进C的陷阱,C++开发的时候就定义了一种新的方法来避免这种情况,那就是字符串类。
字符串类的出现很好的避免了上面的情况,用不同的格式来规避上面的陷阱,至于字符串类我们就放在后面说自定义类的时候会一起讲到。
🆗到这里这篇关于字符的陷阱就说完了,求一个免费的赞,感谢阅读。