分析编程语言缺陷的一种方法是把所有的缺陷归于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. ActiveX 控件漏洞挖掘之方法

    ActiveX是微软公司提出,并在1996年被正式命名的组件技术.该技术提供了一种通用的开放程序接口,使用这种技术开发的ActiveX控件可以直接集成到IE浏览器或第三方应用程序中,但由于第三方编程等 ...

  2. Unity3D新手教学,让你十二小时,从入门到掌握!(三 ) [转]

    版权声明:本文为Aries原创文章,转载请标明出处.如有不足之处欢迎提出意见或建议,联系QQ531193915 这一讲,我会教大家如何写碰撞检测的代码,然后还会教大家如何使用我介绍给大家的第一个Uni ...

  3. Kotlin 特性 语法糖 优势 扩展 高阶 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. html input type=date 赋值问题 必须yyyy-mm-dd格式

    type=date ,日期类型默认格式是yyyy-mm-dd 因此必须给该控件赋值yyyy-mm-dd格式的数据 错误的赋值 <input type="date" id=&q ...

  5. 【Python】Python Mako模板使用

    参考资料: Mako Templates for Python官网:http://www.makotemplates.org/ Python模板库Mako的用法:http://my.oschina.n ...

  6. XMPPFrameWork IOS 开发(三)登录

    原始地址:XMPPFrameWork IOS 开发(三) XMPP中常用对象们: XMPPStream:xmpp基础服务类 XMPPRoster:好友列表类 XMPPRosterCoreDataSto ...

  7. IIs 中运行asp程序出现“An error occurred on the server when processing the URL. Please contact the system administrator.”错误

    在个人的win08系统上使用IIs运行 asp程序结果出现了以下错误 An error occurred on the server when processing the URL. Please c ...

  8. C++ 中特殊的用法

    1.反斜杠 a.转义字符 b.强制换行,当一行代码很长时,在这一行中间加上反斜杠,分成两行,反斜杠前后不能有空格.在预编译的的时候,会合成一行. 2.String^ 表明String是一个托管类型的指 ...

  9. 你远比想象中强大pdf

      读后感: 序 一.强化自我认知 认识你自己 你认为什么东西是最重要的呢? 这个问题的答案就是价值观. 让定期审视人生成为习惯 除去恐惧 树立目标 二.改变思维模式 选择,记住你的选择(做决定) 巅 ...

  10. android开机启动代码

    1)public class StartupReceiver extends BroadcastReceiver { @Override public void onReceive(Context c ...