作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 编译器中负责将程序分解为一个一个符号的部分,称为“词法分析器”.下面看一个例子: if(x > big) big = x; 这个语句的第一个符号是C语言的关键字if,紧接着下一个符号是左括号,再下一个符号是标识符x,再下一个是大于号,再下一个是标识符big,依次类推.在C语言中,符号之间的空白符将被忽略. 本章将探讨符号和组成符号的字符间的关系,以及有关符号含义的一些常见误解. 陷阱1 “=”不同于“==” 将相…
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 陷阱1 理解函数声明 作者提出一个问题:有一个首地址为0的函数,该函数返回值类型为void,没有参数.怎样用C语言的语句调用这个函数? 答案是(*(void  (*)())0)(); 要理解这个调用形式,要清楚如下两个问题: 一是函数指针. 假设fp是一个函数指针,则调用fp所指向的函数的方法是 (*fp)(); 因为fp是一个函数指针,所以*fp是该指针所指向的函数,所以(*fp)()就是调用该函数的方式.AN…
有感自己的C语言在有些地方存在误区,所以重新仔细把"C陷阱和缺陷"翻出来看看,并写下这篇博客,用于读书总结以及日后方便自身复习. 第1章 词法"陷阱" 1.1 =不同与==   = 是赋值操作符,而 == 是作为比较操作符,初学者容易将 == 错写为 = ,这种情况下编译器不会报错,这就有可能造成很严重的后果,还不容易发现.比如下面这个例子: while( c=' ' || c=='\t' || c=='\n' ) { ; }   即使c既不等于'\t',也不等于'…
1.运算符的贪心性,匹配最长的运算符,例如 n-->0,从-开始,-是运算符,--是运算符,-->就不是,所以是 n -- > 0,--是 a---b,-是,--是,,---不是,所以a---b=a-- - b a+++++b,从+开始,+是,++是,+++不是,所以a++是单独的,后面是+,再++b,所以a+++++b=a++ + ++b y=x/*p,/是运算符,/*是注释的开始,也是,所以左边的意思是y=x注释开始p,如果写成y=x/ *p,那么就是y=x/(*p)的意思了 2.…
1.= 与==的区别 赋值运算符= 的优先级要小于逻辑运算符== 也就是说,会进行先逻辑上的比较,然后再把比较结果进行赋值,很合理. getc库是什么??? 1.C语言中有单字符 = 也有多字符单元如:== C语言对这一问题的解决方案为:每个符号应该包含尽可能多的字符.即贪心法的处理策略 所以例如: a---b 与a --  -b 相同 与a- --b 不同 1.如果一个整型常量的第一个字符是数字0,那么该常量会被视作八进制数 如: 10与 010 的含义是不同的 0195的含义是 1* 8^2…
下载地址:点我 凯尼格 (作者), 高巍 (译者) <C和C++经典著作:C陷阱与缺陷>适合有一定经验的C程序员阅读学习,即便你是C编程高手,<C和C++经典著作:C陷阱与缺陷>也应该成为你的案头必 备书籍.作者以自己1985年在Bell实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对C程序员具有珍贵价值的经典著作.写作<C和C++经典著作:C陷阱与缺陷>的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍.<C和C++经典著作:C…
版权声明:本文为Focustc原创文章.转载请注明作者及出处. https://blog.csdn.net/caozhankui/article/details/35925939 看完<C陷阱与缺陷>,忍不住要又一次翻一下,记录一下与自己的惯性思维不符合的地方. 记录的是知识的增量.是这几天的流量,而不是存量. 这本书是在ASCI C/C89订制之前写的.有些地方有疏漏. 第一章 词法陷阱 1.3 C语言中解析符号时使用贪心策略,如x+++++y将被解析为x++ ++ +y.并编译出错. 1.…
第一章 词法陷阱 术语“符号”指的是程序的一个基本组成单元,其作用相当于一个句子中的单词.编译器中负责将程序分解为一个一个符号的部分,一般称为“词法分析器”. 1.1 =不同于== 一般容易将比较运算误写成赋值运算的情形,另一方面,如果把赋值运算误写成比较运算,同样会造成混淆:if((filedesc==open(argv[i],0))<0)error(); 在本例中,如果函数open执行成功,则返回0或者正数:而如果函数open执行失败,将返回-1.上面这段代码的本意是将函数open的返回值存…
第一章 词法“陷阱” 1. =不同于== if(x = y) break; 实际上是将y赋给x,再检查x是否为0. 如果真的是这样预期,那么应该改为: if((x = y) != 0) break; 2. &和| 不同于 && 和 ||   3.词法分析中的“贪心法” 编译器将程序分解成符号的方法是:从左到有一个一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符床是否可能是一个符号的组成部分:如果可能,继续读入下一个字符,重复上述判断…
第一章 词法"陷阱" 1.4整型常量 如果一个整型常量的第一个字符是数字0,那么该常量将被视作八进制数.因此,10与010的含义截然不同.需要注意这种情况,有时候在上下文为了格式>对齐的需要,可能无意中将十进制数写成了八进制数,例如: struct{ int part_number; char *description; }parttab[] = { 046, "left-handen widget" , 047, "right-handed wid…