3. 语法"陷阱"】的更多相关文章

没有一门编程语言是完美的,JavaScript 也不例外,它语法陷阱重重,防不胜防: 加号 "with" 分号自动插入 声明提升 "eval" 多行字符串 变量泄漏 "arguments.callee" ... 了解和熟悉这些陷阱,并在开发时注意规避它们,可以给我们省去很多麻烦事. 加号 作为二元运算符时,+ 既是数学运算的加法,也是字符串的拼接.另外,它还可以作为一元符号,表示正数. 看看下面的代码: console.log( 1 + 2 );…
第2章 语法陷阱 2.1 理解函数声明   当计算机启动时,硬件将调用首地址为0位置的子例程,为了模拟开机时的情形,必须设计出一个C语言,以显示调用该子例程,经过一段时间的思考,得出语句如下: ( *(void(*) () )0 ) ();   像这样的表达式看起来很难理解,但只要将其一层一层地剥离,还是能够理解的.下面我将用几个例子来帮助大家逐渐理解这个表达式. void *a(); void (*b) ();   因为()的优先级高于,所以a()为(a()),a是一个函数,该函数的返回类型为…
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 陷阱1 理解函数声明 作者提出一个问题:有一个首地址为0的函数,该函数返回值类型为void,没有参数.怎样用C语言的语句调用这个函数? 答案是(*(void  (*)())0)(); 要理解这个调用形式,要清楚如下两个问题: 一是函数指针. 假设fp是一个函数指针,则调用fp所指向的函数的方法是 (*fp)(); 因为fp是一个函数指针,所以*fp是该指针所指向的函数,所以(*fp)()就是调用该函数的方式.AN…
1. C运算符优先级 运算符(优先级从高到低) 结合律 ++(后置).--(后置).()(函数调用).[].{}.(复合字面量).. .-> 从左往右 ++(前置).--(前置).-.+.~.!.*(解引用).&(取址).sizeof._Alignof(类型名)(本栏都是一元运算符) 从右往左 (类型名) 从右往左 *./.% 从左往右 +.-(都是二元运算符) 从左往右 <<.>> 从左往右 <.>.<=.>= 从左往右 ==.!= 从左往右…
1.函数的调用和番薯返回值是函数指针的声明 定义一个函数指针,例如  int (*fp)(float),这个函数的返回值是Int,参数是1个float类型,调用这个函数的方法是 (*fp)(),还有fp()是对前面的简写 定义一个函数返回函数指针,典型的 是signal函数,用typedef它应该是这样定义的 typedef void (*FUNC)(int); FUNC signal(int,FUNC) 摊开写就是  void (*)(int)  signal(int , void (*)(i…
2.1理解函数声明 不论什么C变量的声明都由两部分组成:类型以及一组类似表达式的声明符号.比如 float f; 这个声明的含义是:当对其求值时,表达式f和g的类型为浮点数类.由于声 明符与表达式的相似.所以我们也能够在声明符中随意使用括号: float ((f)) 这个声明的含义是:当对其求值时,W)的类型为浮点类型,由此能够推知,f也是浮点类型.类似的. float *g(),(*h)(); 表示*g()与(*h)()是浮点表达式. 由于()结合优先级高于*.*g()也就是*(g()):g是…
1. 词法“陷阱” = 不同于 == , 可以通过if( 1 == a )来避免 & | 不同于 && || 词法分析中的“贪心法” 编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分:如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号.这个处理策略被称为“贪心法”,也称为“大嘴法”.举例:a---b 等价于…
词法分析: 编译器将程序分解成符号的方法是 从左到右一个一个字符的读入,如果该字符可能组成一个符号,再读入下一个字符 而c语言里的符号 / * =只有一个字符长, 是单字符的, /* == 一些事双字符符号. 故因此有以下陷阱 a---b     等价     a-- -b y= x/*p      /*被编译器理解成一段注释的开始 因此应该写成y = x / *p 或者 y = x/(*p) 整型常量 : 如果一个整形常量的第一个字符是数字0 那么该常量将被视作八进制,有时候在上下文中为了格式…
第二章 语法陷阱 2.1 理解函数声明 (*(void(*)())0)();任何C变量的声明都由两部分组成:类型以及一组类似表达式的声明符.一旦我们知道了如何声明一个给定类型的变量,那么该类型的类型转换符只需要添加一个括号即可的到.例如 float (*h)();表示h是一个指向返回值为浮点类型的函数的指针.因此(float (*h)())表示一个"指向返回值为浮点类型的函数的指针"的类型转换符. 第一步假设fp是一个函数指针,那么通过(*fp)()调用fp所指向的函数,可以简写问fp…
http://www.cnblogs.com/hbiner/p/3591335.html?utm_source=tuicool&utm_medium=referral 这段时间把<C陷阱和缺陷>看了,没时间自己写总结.就转一下别人的学习笔记吧http://bbs.chinaunix.net/thread-749888-1-1.html Chapter 1 词法陷阱 程序中的单个字符孤立起来看并没有什么意义,只有结合上下文才有意义,如p->s = "->"…