博客主页:https://blog.csdn.net/wkd_007
博客内容:嵌入式开发、Linux、C语言、C++、数据结构、音视频
本文内容:介绍C语言的符号容易出错的地方
金句分享:天才就是最像自己的人。 ——塞隆尼斯·蒙克
C 语言的基本符号就有 20 多个,每个符号可能同时具有多重含义,而且这些符号之间
相互组合又使得 C 语言中的符号变得更加复杂起来。本文介绍C语言符号中,容易出错的地方。
符号 | 名称 | 符号 | 名称 |
---|---|---|---|
, | 逗号 | > | 右尖括号 |
. | 圆点 | ! | 感叹号 |
; | 分号 | | | 竖线 |
: | 冒号 | / | 斜杠 |
? | 问号 | \ | 反斜杠 |
’ | 单引号 | ~ | 波折号 |
“ | 双引号 | # | 井号 |
( | 左圆括号 | ) | 右圆括号 |
[ | 左方括号 | ] | 右方括号 |
{ | 左大括号 | } | 右大括号 |
% | 百分号 | & | and(与) |
^ | xor(异或) | * | 乘号 |
- | 减号 | = | 等于号 |
< | 左尖括号 | + | 加号 |
C语言中,注释符有两种
//...
/*...*/
几个注意事项:
int/*...*/i
是正确的,而语句 in/*...*/t i
是错误的;/*
在 /
和 *
直接没有空格就表示注释开始,后面的内容会被注释掉;所以语句y=x/*p
是错误的,需要写成y=x / *p
;char *s="adc //def";
是正确的。接续符:C语言里,以反斜杠(\
)为接续符,编译器会将反斜杠剔除,跟在反斜杠后面的字符会自动接续到前一行。注意,反斜杠后面不能有空格,反斜杠下一行之前也不能有空格。
下面例子都是合法的:
//这是一条合法的\
单行注释
/\
/这是一条合法的单行注释
#def\
ine MAC\
RO 这是一条合法的\
宏定义
cha\
r* s="这是一个合法的\\
n 字符串";
反斜杠在C语言中还可以用作转义符,下面是常见的转义符:
转义字符 | 转义字符的意义 |
---|---|
\n | 回车换行 |
\t | 横向跳到下一制表位置 |
\v | 竖向跳格 |
\b | 退格 |
\r | 回车 |
\f | 走纸换页 |
\\ | 反斜扛符"\" |
\’ | 单引号符 |
\a | 鸣铃 |
\ddd | 1~3 位八进制数所代表的字符 |
\xhh | 1~2 位十六进制数所代表的字符 |
单引号引起来的都是字符常量,如:'a'、'b'、'c'
;
双引号引起来的都是字符串常量,如:"a"、"b"、"c"
;
注意: 字符常量'a'
和 字符串常量"a"
,在内存中,前者占1个字节,后者占2个字节,因为字符串常量还需要存一个字符串结束符\0
。"a"
实际上存了这两个字符:'a'
、'\0'
。
C语言的运算符可分为以下几类:
- 算术运算符:用于各类数值运算。包括加(
+
)、减(-
)、乘(*
)、除(/
)、求余(或称模运算,%
)、
自增(++
)、自减(--
)共七种。- 关系运算符:用于比较运算。包括大于(
>
)、小于(<
)、等于(==
)、 大于等于(>=
)、小于等
于(<=
)和不等于(!=
)六种。- 逻辑运算符:用于逻辑运算。包括与(
&&
)、或(||
)、非(!
)三种。- 位操作运算符:参与运算的量,按二进制位进行运算。包括位与(
&
)、位或(|
)、位非(~
)、
位异或(^
)、左移(<<
)、右移(>>
)六种。- 赋值运算符:用于赋值运算,分为简单赋值(
=
)、复合算术赋值(+=,-=,*=,/=,%=
)和复合位运
算赋值(&=,|=,^=,>>=,<<=
)三类共十一种。- 条件运算符:这是一个三目运算符,用于条件求值(
? :
)。- 逗号运算符:用于把若干表达式组合成一个表达式(
,
)。- 指针运算符:用于取内容(
*
)和取地址(&
)二种运算。- 特殊运算符:有括号
()
,下标[]
,成员(->
、.
)等几种。
下文挑几个容易出错的介绍。
逻辑运算符 &&
,两边的条件只要有一个为假,其结果就为假,所以只要第一个条件为假时,第二个条件的语句就不会执行。
可以用下面代码验证,结果i=1
、j=2
;
#include
int main()
{
int i=0;
if(++i<0 && ++i>0)// 只执行了++i<0, 条件为假, && 后面的语句没执行
{
}
printf("i=%d \n",i);
int j=0;
if(++j>0 && ++j<0)// 执行了++j>0, 条件为真, && 后面的语句才执行
{
}
printf("j=%d \n",j);
return 0;
}
逻辑运算符 ||
,两边的条件只要有一个为真,其结果就为真,所以只要第一个条件为真时,第二个条件的语句就不会执行。这里不给代码了,自己试试看。
位操作运算符包括位与(&
)、位或(|
)、位非(~
)、位异或(^
)、左移(<<
)、右移(>>
)六种。
几个注意点:
&
)、位或(|
)使用时要与逻辑与(&&
)、逻辑或(||
)区分开;#define SETBIT(x,y) ((x)|=(y))
<<
,是把<<
左边的数的各二进制位全部向左移动若干位,由<<
右边的数指定移动的位数,高位丢弃,低位补 0;>>
是双目运算符。其功能是把 >>
左边的运算数的各二进位全部右移若>>
右边的数指定移动的位数。但注意:对于有符号数,在右移时,符号位将随同请问下面代码,ret的值是多少?不同的编译器可能会给出不同结果,gcc编译器的答案是16:
int i = 3;
int ret = (++i) + (++i) + (++i);
几个注意点:
++
、--
作为前缀时,是先自加或自减再做别的运算;++
、--
作为后缀时,是在遇到 ,
或 ;
时,认为计算单位结束才自加或自减的;贪心法:C 语言有这样一个规则,每一个符号应该包含尽可能多的字符。也就是说,编译器将程序分解成符号的方法是,从左到右一个一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。
花括号的作用就是打包,为了把一些语句或代码打个包包起来,使之形成一个整体,并与外界绝缘。
下面语句哪些对,哪些错?
char a[10] = {“abcde”}; // 正确
char a[10] { = “abcde”};// 错误
int ret = {(++i) + (++i) + (++i)}; // 正确
本文介绍了C语言的符号容易出错的地方,先是介绍注释符、接续符、转义符、单引号、双引号,然后介绍逻辑运算符、位运算符、自加(++)、自减(–)、运算符优先级 ,最好介绍花括号的作用。
如果文章有帮助的话,点赞、收藏⭐,支持一波,谢谢