奇怪的C语言特性
下面列出的特性未必奇怪,有的算是有趣。
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://www.steike.com/code/useless/evil-c/
《C陷阱与缺陷》
相关推荐
-
奇怪的C语言特性
下面列出的特性未必奇怪,有的算是有趣. 1)a[2] 等价于 2[a] "aabbccdd"[5] 等价于 5["aabbccdd"] 这条特性可以用于使用数组.指针.字符串,但不能用在变量定义时.K&R C Programming language 217页对此有介绍. 2)二元.三元复合字符 http://en.wikipedia.org/wiki/Digraphs_and_trigraphs 字符串字面值??!将被认为是|,所以两个问号同时出现在字符串
-
Ruby的语法和语言特性总结
Ruby是一种解释型.面向对象.动态类型的语言.Ruby采取的策略是在灵活性和运行时安全之间寻找平衡点.随着Rails框架的出现,Ruby也在2006年前后一鸣惊人,同时也指引人们重新找回编程乐趣.尽管从执行速度上说,Ruby谈不上有多高效,但它却能让程序员的编程效率大幅提高.本文将讲述Ruby语言的基础语言特性,包括基本的语法及代码块和类的定义. 1. 基础 在Ruby交互命令行中输入以下命令(>>为命令行提示符,=>为返回值:下文将把=>符号和语句写在一行内表明其返回值): &
-
新Orcas语言特性-查询句法
[原文地址]New "Orcas" Language Feature: Query Syntax [原文发表日期] Saturday, April 21, 2007 2:12 上个月我开始了一个贴子系列,讨论作为Visual Studio和.NET框架Orcas版本一部分发布的一些新的VB和C#语言特性.下面是该系列的前三篇贴子的链接: 自动属性,对象初始化器,和集合初始化器 扩展方法 Lambda表达式 今天的贴子要讨论另一个基础性的新语言特性:查询句法(Query Syntax).
-
浅谈关于JavaScript的语言特性分析
前言在JavaScript中,作用域.上下文.闭包.函数等算是精华中的精华了.对于初级JSer来说,是进阶必备.对于前端攻城师来说,只有静下心来,理解了这些精华,才能写出优雅的代码. 本文旨在总结容易忘记的重要知识,不会讲基本的概念.如果对基本知识不太熟悉,就去翻下< JavaScript权威指南>吧~ 语言特性函数表达式 先看代码段: 复制代码 代码如下: [javascript] view plaincopyprint?var f = function foo(){ return
-
理解Javascript的动态语言特性
Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行:javascript提供eval()函数,用于动态解释一段文本,并在当前上下文环境中执行. 首先我们需要理解的是eval()方法它有全局闭包和当前函数的闭包,比如如下代码,大家认为会输出什么呢? var i = 100; function myFunc() { var i = 'test'; eval('i = "hello."'); } myFunc(); alert(i
-
Javascript 面向对象特性
1. JavaScript中的类型 -------- 虽然JavaScript是一个基于对象的语言,但对象(Object)在JavaScript中不是第一型的.JS 是以函数(Function)为第一型的语言.这样说,不但是因为JS中的函数具有高级语言中的函 数的各种特性,而且也因为在JS中,Object也是由函数来实现的.--关于这一点,可以在 后文中"构造与析构"部分看到更进一步的说明. JS中是弱类型的,他的内置类型简单而且清晰: ------------------------
-
实例简介PHP的一些高级面向对象编程的特性
一般来说,学习PHP需要了解下面的一些特性: 对象克隆.PHP5中对OOP模型的主要改进之一,是将所有对象都看作引用,而不是值.但是,如果所有对象都视为引用,那么如何创建对象的副本呢?答案是通过克隆对象. <?php class Corporate_Drone{ private $employeeid; private $tiecolor; function setEmployeeID($employeeid) { $this->employeeid = $employeeid; } func
-
易语言是主流编程语言吗?易语言是什么
给大家详细介绍一下易语言 a.易语言感觉就是翻译成中文版的那些英语编译语言,易语言解决的问题是没有一点英文基础的编程初学者的入门问题,所以易语言的这个优势没有任何"入流"的机会 b.企业或者社会缺的看英文文档.论文的阅读能力的人 c.程序和英语,必须好玩才好玩下去 一.简介 易语言是一门以中文作为程序代码编程语言,其以"易"著称,创始人为吴涛.易语言早期版本的名字为E语言.其最早的版本的发布可追溯至2000年9月11日.创造易语言的初衷是进行用中文来编写程序的实践,
-
ES10 特性的完整指南小结
本篇文章主要介绍了ES10 特性的完整指南,分享给大家,具体如下: ES10 还只是一个草案.但是除了 Object.fromEntries 之外,Chrome 的大多数功能都已经实现了,为什么不早点开始探索呢?当所有浏览器都开始支持它时,你将走在前面,这只是时间问题. 在新的语言特性方面,ES10 不如 ES6 重要,但它确实添加了一些有趣的特性(其中一些功能目前还无法在浏览器中工作: 2019/02/21) 在 ES6 中,箭头函数无疑是最受欢迎的新特性,在 ES10 中会是什么呢? Big
-
python入门学习关于for else的特殊特性讲解
目录 For-Else 特性的基础知识 使用 For-Else 特性的三个场景 1. 迭代并查找没有标志变量的项 2. 帮助打破嵌套循环 3. 帮助处理异常 总结 不管我们使用哪种编程语言,我们都会写"if-else"语句,但是"for-else"怎么样呢? 对于许多语言,例如 c. c + + 和 Java,如果在循环之后使用"else",那是完全错误的.然而,Python 作为一种优雅的语言,有这种奇怪但有用的特性.如果我们正确地使用它,我们
随机推荐
- ruby中并发并行与全局锁详解
- PHP 如何获取二维数组中某个key的集合
- Bootstrap fileinput文件上传组件使用详解
- javascript xml xsl取值及数据修改第1/2页
- C++ 中const对象与const成员函数的实例详解
- Js+Flash实现访问剪切板操作
- vbs 解析html文档的方法(htmlfile)
- hibernate属性级别注解实例代码
- iOS仿微信添加标签效果(shape实现)
- iOS CoreAnimation 图层几何学
- Linux下安装配置nginx详解
- asp.net core项目mvc权限控制:分配权限
- php学习笔记 [预定义数组(超全局数组)]
- JavaScript中的substr()方法使用详解
- javascript一个无懈可击的实例化XMLHttpRequest的方法
- js模拟支付宝密码输入框
- 利用JQuery为搜索栏增加tag提示
- 浅析Java中Data类的应用
- win2003上安装SQL2000时CD-KEY(序列号)无法验证解决方法
- Android自定义view实现圆形、圆角和椭圆图片(BitmapShader图形渲染)