C语言缺陷和陷阱
C语言是一种功能强大且灵活的编程语言,但是它也存在一些缺陷和陷阱,需要程序员小心避免。在这篇文章中,我们将介绍C语言中的常见缺陷和陷阱,以及如何避免它们。
让我们来讨论C语言的词法分析器(lexical analyzer)。词法分析器的作用是检查组成程序的字符序列,并将它们划分为记号(token)。记号是一个由一个或多个字符构成的序列,它在语言被编译时具有一个(相关地)统一的意义。C程序被两次划分为记号,首先是预处理器读取程序,它必须对程序进行记号划分以发现标识宏的标识符。通过对每个宏进行求值来替换宏调用,经过宏替换的程序又被汇集成字符流送给编译器。编译器再第二次将这个流划分为记号。
1.1 =不是 ==:C语言中使用=表示赋值,而用==表示比较。这是因为赋值的频率要高于比较,因此为其分配更短的符号。C还将赋值视为一个运算符,因此可以很容易地写出多重赋值(如a = b = c),并且可以将赋值嵌入到一个大的表达式中。
1.2 &和|不是&&和||:在C语言中,&和|是按位运算符,而&&和||是逻辑运算符。这两个运算符的优先级不同,需要注意区分它们。
1.3 多字符记号:C语言参考手册说明了如何决定:“如果输入流到一个给定的字符串为止已经被识别为记号,则应该包含下一个字符以组成能够构成记号的最长的字符串”“最长子串原则”。
1.4 例外组合赋值运算符:如+=实际上是两个记号。因此,a + /* strange */ = 1和a += 1是一个意思。看起来像一个单独的记号而实际上是多个记号的只有这一个特例。
1.5 字符串和字符:包围在单引号中的一个字符只是编写整数的另一种方法。这个整数是给定的字符在实现的对照序列中的一个对应的值。而一个包围在双引号中的字符串,只是编写一个有双引号之间的字符和一个附加的二进制值为零的字符所初始化的一个无名数组的指针的一种简短方法。
在理解C语言的语法和语义时,需要注意以下几点:
2.1 理解声明:每个C变量声明都具有两个部分:一个类型和一组具有特定格式的、期望用来对该类型求值的表达式。
2.2 运算符并不总是具有你所想象的优先级:绑定得最紧密的运算符并不是真正的运算符。需要注意运算符的优先级和结合性,以避免编程错误。
C语言是一种强大且灵活的编程语言,但是它也存在一些缺陷和陷阱,需要程序员小心避免。在编程时,需要注意C语言的语法和语义,避免一些常见的错误和陷阱。