练习1-23
这个主函数就一个作用调用rcomment函数。。。
其实也不难理解,学到这里我也发现如果想学好就自己主动去编写一些小东西。然后出错了就去改,再改的过程中自然而然就知道程序为什么要这么写,这里为什么这么用。很多逻辑上的东西也会变得条理清晰。而且如果在书上或者别人写的语句不明白什么意思,单独拿出来写个小程序看看结果是什么也能知道是怎么回事。
进入rcomment函数后先判断是不是/因为注释开始是/和现在还有一种注释是//
然后如果是/那么再读取一个字符因为每有一个getchar就读取一个字符。那么判断是不是如果是那么就证明是注释所以就调用in_comment函数进行操作。先读取两个字符然后分别给c和d然后判断是不是注释结束符。如果不是继续读取判断。函数是一个一个读取然后将值向前传的,因为首先读取到的结束符肯定是然后才是/所以要先给d然后将d再传给c。(这里有个问题就是,题目说了是合法的c程序。如果不是合法的话只有/没有注释结束符/我测试了一下是后面的都没了。。。)因为这个函数只有读入字符而不进行输出。所以这段字符就相当于被吃掉了。
然后下面那个判断新读取的字符是不是/这个是老版本的用法新的还有一种是//两个斜杠。/**/这种注释不限制长度多长都可以而//只能在当前行进行注释。所以这里按现在的方法应该改一下上面的in_comment函数判断是不是换行符就可以了。书上写的是如果又是一个/那么将这个/也就是d带入此函数重新向下进行判断。
然后如果以上两种情况都不是的话就打印出读取的这两个字符。
然后就是判断单引号和双引号。因为单引号或者双引号都是一对,都是一样的所以就判断c(单引号或双引号)是否等于新读取的字符(另一个单引号双或引号)。
下面这个有点意思,判断是否是转义后的单双引号。因为转义后的单双引号只是代表了单双引号本身,并不代表单双引号的结束。所以不管\后面接的是什么都将他忽略,而忽略就是putchar(getchar()) 这里了解的话就很容易理解,遇到\后getchar()直接读取一个字符然后不进行任何操作就将其打印。然后d = getchar()就会读取下一个字符,因为读取是依次的这个字符被前一个getchar读取后就到下一个了。所以就直接降\后面接的字符跳过判断了。这点挺有意思。