时间:2021-05-19
下面列出的特性未必奇怪,有的算是有趣。
1)a[2] 等价于 2[a]
"aabbccdd"[5] 等价于 5["aabbccdd"]
这条特性可以用于使用数组、指针、字符串,但不能用在变量定义时。K&R C Programming language 217页对此有介绍。
2)二元、三元复合字符
http://en.wikipedia.org/wiki/Digraphs_and_trigraphs
字符串字面值??!将被认为是|,所以两个问号同时出现在字符串的时候一定要小心。二元复合字符在C99被引入,如<:等价于[
3)Duff's Device
http://en.wikipedia.org/wiki/Duff%27s_device
特点是switch与while交错出现。代码类似
4)同名同姓现象
在《C陷阱与缺陷》中有详细解释。
5)a[i++]= i;
这个好像是依赖特定编译器实现,我在Xcode实验结果为先对a[i]赋值i,然后操作i++。此类代码一定要小心。如果你在做code review发现++ –出现在其它表达式中或者作为参数出现,一定要立刻马上把它移出来作为单独语句,小心驶得万年船。
6)sizeof
sizeof(x), x可以是一个表达式或者类型名,如果是表达式,不做运算,int x = 1; size_t sz = sizeof(x++); X不会增加。T *p = NULL; p = malloc(sizeof *p); p并没有提领,K&R圣书也有讲。
sizeof unary-expr; sizeof(typename);一元表达式可以没有括号,圣书里面语法部分提到。如size_t f = sizeof 99;
7)宏定义要小心
例如:#define FOO(a,b) (a+b)/(1-a)如果这样调用FOO(bar++,4),自增两次,当然,把宏展开就非常清楚了。
参考资料:
http:///code/useless/evil-c/
《C陷阱与缺陷》
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
JavaScript的核心之一ECMAScript的语言特性和Java、C、Perl都有许多相似之处,其中不少特性都是从这些语言借鉴而来,同时它们之间也存在许多
对于那些具有高级编程语言诸如:Ruby、Scheme、Haskell等背景的人来说,学习C语言是具有挑战性的。除了纠结于C语言中像手动内存管理和指针等底层特性外
golang这门语言,有个比较好的特性,就是支持函数的多返回值。想C,C++,Java等这些语言,是不支持函数多返回的。但是C,C++可以使用传递指针,实现函数
前言:还是一篇入门文章。Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包对于那些使用传统静态语言C/C++的程序员来说是一个新的
Perl是什么? Perl是一个高阶程式语言,由LarryWall和其他许多人所写,融合了许多语言的特性。它主要是由无所不在的C语言,其次由sed、awk,U