C语言陷阱与缺陷 第一章学习

    xiaoxiao2021-12-14  21

    1.词法陷阱

    1.什么是词法分析器

    编译器中负责将程序分解的一个一个的符号的部分,一般都为“词法分析器”。 例子:if(x>big) big = x; 这个我们自己理解起来也很好理解,就是如果x>big的时候把x的数据赋值给big,这个很简单的东西在一些算法中会用到,比如快速查询算法当中。 #include<stdio.h> #include<stdlib.h> int main() { int x = 10, big = 0 ; if ( x > big ) big = x ; system("pause"); return 0; 这样的程序也能正常的运行,在我看来第一是不美观,第二个在说明在c语言的编辑器中,符号之间的空白(包括空格符,制表符或换行符)都被忽略,因此上面的语句可以执行。这让我想到一个程序,尹成老师的一个#define 换成中文的程序,印象特别的深不过本质不一样。

    =不同==

    这个问题,写过一段时间的程序的人基本不会在范这个错误(或者说很少范这个错误)现在的编辑器都可以直接规避这个问题。 书中有一个例子可以拿出来说一下我自己的看法 if(x=y) foo() 应该写成 if((x = y) != 0) foo()这两段比较有代表性,第一种大家一看就知道是范了上面说的错误,但是为什么要写成第二种了,我的理解首先把(x = y)把它算出来,然后再跟0进行比较。如果为真就执行foo。 从这上面总结出来:if语句里面包含的一定要是一个比较运算表达式。

    &和| 不等同于 && 和||

    这种错误如果写过一段时间的朋友基本上也不会范

    词法分析中的"贪心法"

    1.单字符号

    比如/,*,=我理解就是一个单独就可以成为有意义的字符。

    2.多字符符号

    除了单字符符号以外的成为多字符符号。

    3.c编辑器的规则

    是将其作为两个分号的符号对待,还是和起来作为一个符号对待。C语言对这个问题的解决方案可以归纳一个很简单的规则:每一个符号应该包含尽可能多的字符。也就是说,编译器将程序的符号的方法是,从左到右的一个字符一个字符的读入,如果字符可能组成一个符号,那么在读入下一个字符,判断已经读入的两个字符组成的字符串是否是一个符号的组成的部分;如果能,在继续读入下一个字符,重复上面的判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。

    4.例子

    a---b 与表达式a -- - b;相同vs测试 #include<stdio.h> #include<stdlib.h> int main(){ int a = 1, b = 1, c = 0; c = a-- - b; printf("%d\n", c); system("pause"); return 0; }与a - --b是效果不一样的。由此我们可以看出刚才的编辑器的规则的一般引用情况。 列子2 y = x/*p; 在这里我们按照刚才的贪心规则,发现/*很有可能出现一组字符串,就是注释于是我们在vs上测试 #include<stdio.h> #include<stdlib.h> int main() { int y = 0; int a = 10; int x = 10; int *p = NULL; p = &a; y = x/*p; system("pause"); return 0; }我们发现和我们想象的一模一样,他把/*当成了一个整体,这个不是我们想要的。 改进:让我们想要的东西连城一个字符串y = x/(*p);这样我们就能正常的使用。

    整形常量

    整形常量的三种形式:10进制,8进制,十六进制 书上说八进制有可能会出现一个问题c编辑器会把8和9也作为8进制。 首先我们知道8进制是以0开头,我们在编辑器里面去写下 int a = 0915; 我们发现vs根本编译都不让你通过,可能是以前的编辑器有可能出现这个问题,于是我用mac gcc也去做了一下也是不能通过,所以基本上可以说现在这种编辑器的话应该不会出现这种错误。

    字符和字符串

    这个是只有c和c++才有的特殊啊,至少我接触的过的语言一般都只有字符串,没有字符。 出错原因: '’和""没有理解,单引号是字符,双引号是字符串。 例子:char ch = "a"; char *p = 'a'; 本质:字符串是一组字符+"\0"联合起来组成的,在内存中连续存储字符。

    习题:

    a+++++b;它的含义 如果直接拿到编辑器里面运行它会报错。 但是分析一下它的运算法则 1.a 2.a+ 3.a++ 4.a++ + 5.a++ + + 6.a++ + ++ 7.a++ + ++b;
    转载请注明原文地址: https://ju.6miu.com/read-969055.html

    最新回复(0)