分析编程语言缺陷的一种方法是把所有的缺陷归于3类:不该做的做了,该做的没做,该做但做得不合适。

在使用switch case时,如果使用缺省的 fall through,请一定在旁边注释,因为97%的情况需要使用break,break跳出的是最近的那层循环或者switch语句。

下面代码,第一次调用和之后调用会出现不同:

  #include<stdio.h>

  void generate_initializer(const char * string)
{
static char separator=' ';
printf("%c %s\n",separator,string);
separator=',';
}
int main(void)
{
char *p="hi,guy,would you want strengh!";
generate_initializer(p);
generate_initializer(p);
generate_initializer(p);
return ;
}

所以,static使用要走点心。

太多的缺省可见:

定义c函数时,不管你加不加extern修饰,函数名都是全局可见的,这是缺省状态,除非你用static修饰。

一个文件要么全局可见,要么对其他文件不可见。在C语言中,对信息可见性的选择就是这么有限。如果别人问你C语言什么让你觉得难,你可以回答不支持很多特性,千万别回答指针就好^_^。

C语言中的重要符号重载:

static:用在函数内部,表示变量的值在各个调用间一直保持延续性,这句话有点拗口,用通俗一点的话语就是,static修饰的局部变量,只初始化一次,而且它的值会一直保存。

用来修饰一个函数时,表示该函数只对本文件可见。

extern:用于修饰变量时,表示变量在其他地方(外部文件)定义了

用于函数的时候表示全局可见,属于冗余的,因为函数缺省状态就是全局可见的。

当sizeof的操作数是类型名时,两边必须加上括号(这通常让人误以为它是一个函数),但操作数如果是变量则不必加括号。sizeof是运算符。

优先级可以查看c和指针81页和c2p 最后一页。

现在有如下表达式:

apple=sizeof(int)*p;你觉得这个表达式应该如何解读?

A:这里又很多种可能的解释,但是为了不误导或者留下误导的索引,直接分析了。

sizeof ,强制转化的括号()和解引用*的优先级相同,所以,要是解释为:解引用指针p强制转换成int再sizeof肯定是不对的,为什么呢?它们三个的结合性都是从右向左的,所以sizeof(int)已经结合,要是*p再结合,编译器必然要报操作符错误,我们可以再加上一个乘号*,这样就明了了。

  #include<stdio.h>

  int main(void)
{
char tmp='a';
char *p=&tmp;
int res;
res=sizeof(int)**p;
printf("%d\n",res);
return ;
}

要是不加一个操作符乘号*上去,会报错:

从这里我们可以知道,上面的写法是sizeof(int),其中括号不表示强制转化,表示聚组功能,优先级比sizeof还高。

三个尤其注意的优先级问题:

1.==和!=的优先级高于&或|

2.算术运算高于一维运算:msb<<4+lsb 等价于msb<<(4+lsb)

3.逗号运算符优先级最低,比赋值都低:i=1,2 等价于(i=1),2

空格——最后的领域:

“\”反斜杠,用在宏上时,后面不要接空格,应该直接换行,

 #include<stdio.h>
#define my 111\ #define you 111\ int main(void)
{
printf("%d\n%d\n",my,you+);
return ;
}

预编译之后,111和0之间还是有空格的,所以反斜杠让我们书写宏的时候可以在多行操作,但是不能用于连接字符,因为会多出空格,同样,在多出空格不会影响代码的时候,反斜杠“\”后面也不应该加空格,应该直接换行。

 #include<stdio.h>

 int main(void)
{
char a[]="abc\
d";
printf("%u\n",sizeof(a)); char b[]="abcd";
printf("%u\n",sizeof(b));
return ;
}

多出一个空格,这个是转义回车造成的。

同样,在z=y+++++x;这样的表达式中,我们需要空格,不然编译器无法解析上面的代码,应该手动空格分离为:

z=y++  +   ++x;这样编译器才知道上面意思。在这样的表达式中,ANSI C规定了一种逐渐为人熟知的”maximal munch strategy”(最大一口策略)。这种策略表示如果下一个标记有超过一种的解决方案,编译器将选取能组成最长字符序列的方案,例如:z=y+++x;会被编译器分解成z=y++  + x;因为第一个+之后,后面还有一个+,可以组成最长字符++.但是上面那个z=y+++++x;不手动加空格就不能被编译器正常分解,编译器正常分解成z=y++  ++   +x;这样会报错。

这不是bug,而是语言特性的更多相关文章

  1. 洛谷 题解 UVA658 【这不是bug,而是特性 It's not a Bug, it's a Feature!】

    [题意] 补丁在修正\(BUG\)时,有时也会引入新的\(BUG\),假定有\(n(n<=20)\)个潜在\(BUG\),和\(m(m<=100)\)个补丁,每个补丁用两个长度为\(n\) ...

  2. Pro ASP.NET MVC –第四章 语言特性精华

    C#语言有很多特性,并不是所有的程序员都了解本书我们将会使用的C#语言特性.因此,在本章,我们将了解一下作为一个好的MVC程序员需要了解C#语言的特性. 每个特性我们都只是简要介绍.如果你想深入了解L ...

  3. XAML 名称范围 (x:) 语言特性

    本节介绍为 Windows 运行时实现的 XAML 语言特性的参考信息. 本部分内容 主题 描述 x:Class 属性 配置 XAML 编译,在标记和代码隐藏之间连接分部类.代码分部类在一个独立的代码 ...

  4. C++ 语言特性的性能分析

    转载:http://www.cnblogs.com/rollenholt/archive/2012/05/07/2487244.html      大多数开发人员通常都有这个观点,即汇编语言和 C 语 ...

  5. C# 动态语言特性,dynamic 关键字研究

    1       动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 Jav ...

  6. C# 3.0新语言特性和改进(一)

    引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...

  7. 【转】浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  8. 浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  9. 理解Javascript的动态语言特性

    原文:理解Javascript的动态语言特性 理解Javascript的动态语言特性 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行: ...

  10. c#跟objective-c语言特性

    c#跟objective-c语言特性的对比 拿c#语言跟objective-c做个对比,记录下自己认为是差不多的东西. 学过objc的人相信对category这个东西肯定不陌生,它可以让我们在没有源码 ...

随机推荐

  1. 二层交换机当三层交换机,使用单臂路由实现二层交换机上的VLAN互通

    众多中小企业内部网络结构都很简单,仅仅是用一台交换机将所有员工机以及服务器连接到一起,然后通过光纤访问internet而已.当然为了保证部分主机的安全性以及分割内部广播包提高网络传输速度,采取诸如划分 ...

  2. [Todo] 乐观悲观锁,自旋互斥锁等等

    乐观锁.悲观锁.要实践 http://chenzhou123520.iteye.com/blog/1860954 <mysql悲观锁总结和实践> http://chenzhou123520 ...

  3. webapp开发基础

    1.首先我们来看看webkit内核中的一些私有的meta标签,这些meta标签在开发webapp时起到非常重要的作用   <meta content="width=device-wid ...

  4. EasyUI datagrid 明细表格中编辑框 事件绑定 及灵活计算 可根据此思路 扩展其他

    原创 : EasyUI datagrid 明细表格中编辑框 事件绑定 及灵活计算 可根据此思路 扩展其他 转载,请注明出处哦!谢谢! 原创 : EasyUI datagrid 明细表格中编辑框 事件绑 ...

  5. RMSE均方根误差学习笔记

    1.均方根误差,它是观测值与真值偏差的平方和观测次数n比值的平方根,在实际测量中,观测次数n总是有限的,真值只能用最可信赖(最佳)值来代替.方根误差对一组测量中的特大或特小误差反映非常敏感,所以,均方 ...

  6. Negative seek offset的解决方法

    ZIP文件解压的时候出现错误:‍Negative seek offset 原因是把rar文件直接改为ZIP. 必须要 重新压缩为ZIP文件 不能直接修改文件名.

  7. 河流Shader

    原地址:http://www.unity蛮牛.com/blog-2321-336.html Shader "Custom/TextureEffect" { Properties { ...

  8. 利用JqGrid结合ashx显示列表之一

    最近项目决定运用JqGrid列表控件显示相关数据,以前接触比较多还是easyui和Ext.Net的列表控件,文章简单写的小实例进行一个总结: 1:引入相关的JS及CSS文件,JqGrid目前可以利用J ...

  9. react-router-dom Link search 传参

    <Link> 和之前版本没太大区别,重点看下组件属性: to(string/object):要跳转的路径或地址: replace(bool):为 true 时,点击链接后将使用新地址替换掉 ...

  10. MIME protocol 说明

    按照 <张孝祥Java邮件开发详解> 自己create了 emali, 其中jpg 和wav文件格式过大,删除了写内容 From redhat@diego.com Mon Nov 17 0 ...