分析编程语言缺陷的一种方法是把所有的缺陷归于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. Informatica 常用组件Source Qualifier之二 默认查询

    2 默认查询 对于关系源,PowerCenter Server 将在运行会话时为每个源限定符转换生成查询.对于每个在映射中使用的源列,默认查询均为 SELECT 语句.也就是说,PowerCenter ...

  2. Oracle 乱码或则中文无法正确查询问题

    解决Oracle本身的字符集问题 oracle数据库的字符集更改 A.oracle server 端 字符集查询 select userenv('language') from dual 其中NLS_ ...

  3. CC+语言 struct 深层探索——CC + language struct deep exploration

    1        struct 的巨大作用 面对一个人的大型C/C++程序时,只看其对struct 的使用情况我们就可以对其编写者的编程经验进行评估.因为一个大型的C/C++程序,势必要涉及一些(甚至 ...

  4. django from表单基础知识点

    今日概要: - 内容拾遗 - 分页 - Form验证 1.内容拾遗 - 新URL -提交时,保留之前的内容? - 对话框 - var data = $('#fmForm表单的ID').serializ ...

  5. 类的const和非const成员函数的重载

    我们从一个例子说起,来看上一篇文章中的String类, 我们为它提供一个下标操作符([ ])以读写指定位置的字符(char). 只要了解过C++的操作符重载的语法,很快就可以写出下面这个[]操作符重载 ...

  6. SQL IN

    here are some additional clause in the SQL language that can be used to simplify queries by decrease ...

  7. java学习笔记11--集合总结

    java学习笔记系列: java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Ob ...

  8. 步步为营_Android开发课[3]_Activity学习

    Focus on technology, enjoy life! -- QQ:804212028 浏览链接:http://blog.csdn.net/y18334702058/article/deta ...

  9. 《Go并发编程实战》第2版 紧跟Go的1.8版本号

    文章作者:郝林(<Go并发编程实战 (第2版)>作者) 最终来了! 经过出版社的各位编辑.校对.排版伙伴与我的N轮PK和共同努力,<Go并发编程实战>第2版的全部内容最终全然确 ...

  10. iOS arc和非arc 适用 宏

    iOS arc和非arc 适用 宏 1:使用宏 + (void)showAlertWithMessage:(NSString *)messages { dispatch_async(dispatch_ ...