C陷阱与缺陷之语法陷阱
2.1理解函数声明
不论什么C变量的声明都由两部分组成:类型以及一组类似表达式的声明符号。比如
float f;
这个声明的含义是:当对其求值时,表达式f和g的类型为浮点数类。由于声
明符与表达式的相似。所以我们也能够在声明符中随意使用括号:
float ((f))
这个声明的含义是:当对其求值时,W)的类型为浮点类型,由此能够推知,f也是浮点类型。类似的。
float *g(),(*h)();
表示*g()与(*h)()是浮点表达式。
由于()结合优先级高于*。*g()也就是*(g()):g是一个函数。该函数的返回值类型为指向浮点数的指针。同理,能够得出h是一个函数指针,h所指向函数的返回值为浮点类型。
理解了上面的知识后。我们就能够分析signal函数了,signal函数的原型为:
#include <signal.h>
void ( *signal ( int signo ,void (*func)(int) ) ) ( int );
signal函数原型说明该函数须要两个參数,返回一个函数指针,而该指针所指向的函数须要一个整型參数,无返回值。
第一个參数signo是一个整数,第二个參数是函数指针。它所指向的函数须要一个整型參数,无返回值。用自然语言描写叙述也就是要向信号处理程序传递一个整型參数,而它却无返回值。当调用signal设置信号处理程序时,第二个參数是指向该函数(也就是信号处理程序)的指针。
signal的返回值则是指向之前的信号处理程序的指针。
2.2运算符的优先级问题
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFuY2h1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
优先级最高者事实上并非真正意义上的运算符,包含:数组下标、函数调用操作符各结构成员选择操作符。它们都是白左于右结合。因此a.b.c的含义是(a.b).c,而不是a.(b.c)。
单目运算符的优先级仅次于前述运算符。在全部的真正意义上的运算符中。它们的优先级最高。
由于函数调用的优先级要高于单目运算符的优先级,所以假设p是一个函数指针。要调用p所指向的函数,必须这样写:(*p)()。假设写成*p()。编译器会解释成*(p())。类型转换也是单目运算符。它的优先级和其它单目运算符的优先级一样。单目运算符是白右至左
结合,因此*p++会被编译器解释成*(p++),即取指针p所指向的对象。然后将p递增1:而不是(*p)++,即取指针p所指向的对象,然后将该对象递增1。
优先级比单目运算符要低的,接下来就是双目运算符。
在双目运算符中,算术运算符的优先级最高。移位运算符次之,关系运算符再次之,接着是逻辑运算符。赋值运算符,最后是条件运算符(为三目运算符)。
我们须要记住的最重要的两点是:
1.不论什么一个逻辑运算符的优先级低于不论什么一个关系运算符。
2.移位运算符的优先级比算术运算符要低,可是比关系运算符要高。
在全部的运算符中,逗号运算符的优先级最低。这一点非常easy记住,由于逗号运算符经常使用于在须要一个表达式而不是一条语句的情形下替换作为语句结束标志的分号。
2.3注意作为语句结束标志的分号
在C程序中假设不小心多写了一个分号可能不会造成什么不良后果:这个分号或许会被视作一个不会产生不论什么实际效果的空语句;或者编译器会由于这个多余的分号而产生一条警告信息,依据警告信息的提示可以非常easy去掉这个分号。一个重要的例外情形是在if或者while语句之后须要紧跟一条语句时。假设此时多了一个分号,那么原来紧跟在if或者while了句之后的语句就是一条单独的语句。与条件推断部分没有了不论什么关系。考虑以下的
这个例了:
if(x [i]>big);
big=x[i];
2.4 switch语句
switch语句中要注意case后面加break。这样才干起到控制的作用。当然有些时候,有益不加break以达到某种效果。
2.5悬挂else引发的问题
C语言中if else配对规则:else始终同一对括号内近期的为匹配的if结合。
比如这样就可能和违背编程者的本意:
if(x==0)
if(y==0) error();
else{
z = x + y;
}
缩进后。成这样
if(x == 0)
if(y == 0)
error();
else{
z= x + y;
}
为了避免这样的情况,在if和else后面都要加花括号
C陷阱与缺陷之语法陷阱的更多相关文章
- c缺陷与陷阱笔记-第二章 语法陷阱
1.函数的调用和番薯返回值是函数指针的声明 定义一个函数指针,例如 int (*fp)(float),这个函数的返回值是Int,参数是1个float类型,调用这个函数的方法是 (*fp)(),还有f ...
- [C陷阱和缺陷] 第2章 语法“陷阱”
第2章 语法陷阱 2.1 理解函数声明 当计算机启动时,硬件将调用首地址为0位置的子例程,为了模拟开机时的情形,必须设计出一个C语言,以显示调用该子例程,经过一段时间的思考,得出语句如下: ( * ...
- 《C陷阱与缺陷》读书笔记
1. 词法“陷阱” = 不同于 == , 可以通过if( 1 == a )来避免 & | 不同于 && || 词法分析中的“贪心法” 编译器将程序分解成符号的方法是,从左到右一 ...
- C陷阱和缺陷学习笔记
这段时间把<C陷阱和缺陷>看了,没时间自己写总结.就转一下别人的学习笔记吧http://bbs.chinaunix.net/thread-749888-1-1.html Chapter 1 ...
- 《C陷阱与缺陷》阅读笔记(个人版)
笔记: 第一章:词法陷阱 提倡显示比较if((x = y) != 0) foo(); 第二章:语法陷阱 已知一个类型的声明 该类型的类型转换:吧声明中的变量名和声明末尾的分号去掉,再将剩余的部分用括号 ...
- 我的《C陷阱与缺陷》读书笔记
第一章 词法“陷阱” 1. =不同于== if(x = y) break; 实际上是将y赋给x,再检查x是否为0. 如果真的是这样预期,那么应该改为: if((x = y) != 0) break; ...
- 阅读《C陷阱与缺陷》的知识增量
版权声明:本文为Focustc原创文章.转载请注明作者及出处. https://blog.csdn.net/caozhankui/article/details/35925939 看完<C陷阱与 ...
- C语言学习书籍推荐《C陷阱与缺陷》下载
下载地址:点我 凯尼格 (作者), 高巍 (译者) <C和C++经典著作:C陷阱与缺陷>适合有一定经验的C程序员阅读学习,即便你是C编程高手,<C和C++经典著作:C陷阱与缺陷> ...
- JavaScript 语法陷阱
没有一门编程语言是完美的,JavaScript 也不例外,它语法陷阱重重,防不胜防: 加号 "with" 分号自动插入 声明提升 "eval" 多行字符串 变量 ...
随机推荐
- 经常使用MD5算法代码
经常使用的MD5算法代码日期: 2014年8月4日作者: 铁锚 MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请參考 维基百科:MD5 MD5加密后 ...
- POJ 2773 Happy 2006 数学题
题目地址:http://poj.org/problem?id=2773 因为k可能大于m,利用gcd(m+k,m)=gcd(k,m)=gcd(m,k)的性质,最后可以转化为计算在[1,m]范围内的个数 ...
- 《生活在Linux中》之:使用Bash就是使用Emacs
定义bash Emacs模式下的快捷键请参考: Readline-在BASH下自定义键盘热键 未完待续...
- Java线程并发中常见的锁--自旋锁 偏向锁
随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想 ...
- 如何在github中贡献自己的力量
如何参与github的开源项目? 1.找一个发出“pull requests”的项目.有以下几个方法:最简单的方式是,读项目的readme文件.它会告诉你,项目的拥有者是否急切的需要协助.如果read ...
- Android自适应不同屏幕几种方法
因为Android设备的屏幕尺寸.分辨率区别很大.假设希望我们的应用可以在不同屏幕尺寸或分辨率的Android设备上执行,即更换Android设备后界面和字体不会因此变得混乱.则须要考虑屏幕的 ...
- Android 进行单元測试难在哪-part3
原文链接 : HOW TO MAKE OUR ANDROID APPS UNIT TESTABLE (PT. 1) 原文作者 : Matthew Dupree 译文出自 : 开发技术前线 www.de ...
- 在Ubuntu上录制视频和编辑(很全)
Linux多媒体三剑客:GIMP,Inkscape,Blender3D Blender基金会制作的开源微电影Sintel:http://www.sintel.org/about电影采用Creative ...
- 深刻:截获windows的消息并分析实例(DefWindowProc),以WM_NCHITTEST举例(Windows下每一个鼠标消息都是由 WM_NCHITTEST 消息产生的,这个消息的参数包含了鼠标位置的信息)
1,回调函数工作机制 回调函数由操作系统自动调用,回调函数的返回值当然也是返回给操作系统了. 2,截获操作系统发出的消息,截获到后,将另外一个消息返回给操作系统,已达到欺骗操作系统的目的. 下面还是以 ...
- activity_main.xml: java.lang.NullPointerException
1.错误描写叙述 eclipse.buildId=4.4.0.I20140606-1215 java.version=1.7.0_67 java.vendor=Oracle Corporation B ...