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陷阱与缺陷之语法陷阱的更多相关文章

  1. c缺陷与陷阱笔记-第二章 语法陷阱

    1.函数的调用和番薯返回值是函数指针的声明 定义一个函数指针,例如  int (*fp)(float),这个函数的返回值是Int,参数是1个float类型,调用这个函数的方法是 (*fp)(),还有f ...

  2. [C陷阱和缺陷] 第2章 语法“陷阱”

    第2章 语法陷阱 2.1 理解函数声明   当计算机启动时,硬件将调用首地址为0位置的子例程,为了模拟开机时的情形,必须设计出一个C语言,以显示调用该子例程,经过一段时间的思考,得出语句如下: ( * ...

  3. 《C陷阱与缺陷》读书笔记

    1. 词法“陷阱” = 不同于 == , 可以通过if( 1 == a )来避免 & | 不同于 && || 词法分析中的“贪心法” 编译器将程序分解成符号的方法是,从左到右一 ...

  4. C陷阱和缺陷学习笔记

    这段时间把<C陷阱和缺陷>看了,没时间自己写总结.就转一下别人的学习笔记吧http://bbs.chinaunix.net/thread-749888-1-1.html Chapter 1 ...

  5. 《C陷阱与缺陷》阅读笔记(个人版)

    笔记: 第一章:词法陷阱 提倡显示比较if((x = y) != 0) foo(); 第二章:语法陷阱 已知一个类型的声明 该类型的类型转换:吧声明中的变量名和声明末尾的分号去掉,再将剩余的部分用括号 ...

  6. 我的《C陷阱与缺陷》读书笔记

    第一章 词法“陷阱” 1. =不同于== if(x = y) break; 实际上是将y赋给x,再检查x是否为0. 如果真的是这样预期,那么应该改为: if((x = y) != 0) break; ...

  7. 阅读《C陷阱与缺陷》的知识增量

    版权声明:本文为Focustc原创文章.转载请注明作者及出处. https://blog.csdn.net/caozhankui/article/details/35925939 看完<C陷阱与 ...

  8. C语言学习书籍推荐《C陷阱与缺陷》下载

    下载地址:点我 凯尼格 (作者), 高巍 (译者) <C和C++经典著作:C陷阱与缺陷>适合有一定经验的C程序员阅读学习,即便你是C编程高手,<C和C++经典著作:C陷阱与缺陷> ...

  9. JavaScript 语法陷阱

    没有一门编程语言是完美的,JavaScript 也不例外,它语法陷阱重重,防不胜防: 加号 "with" 分号自动插入 声明提升 "eval" 多行字符串 变量 ...

随机推荐

  1. qt新进程工作目录的设置(工作目录确实是被子进程继承的,但也可以设置)

    经过试验,qt启动一个新的进程时,这个进程的工作目录是继承父进程的,无论是通过start还是startDetached来启动. 其实对于linux系统,qt底层应该也是调用fork.exec之类的函数 ...

  2. 与众不同 windows phone (5) - Chooser(选择器)

    原文:与众不同 windows phone (5) - Chooser(选择器) [索引页][源码下载] 与众不同 windows phone (5) - Chooser(选择器) 作者:webabc ...

  3. 14.5.7 Storing InnoDB Undo Logs in Separate Tablespaces 存储InnoDB Undo logs 到单独的表空间

    14.5.7 Storing InnoDB Undo Logs in Separate Tablespaces 存储InnoDB Undo logs 到单独的表空间 在MySQL 5.6.3,你可以存 ...

  4. mysql 创建函数 error Code: 1227. Access denied;

    mysql> show function status; +------+------------------+----------+------------+----------------- ...

  5. 全民Scheme(0):lat的定义

    接下来我会写一写Scheme的学习笔记.嗯,Scheme是属于小众的语言,但合适用来教学的. 什么是lat,就是遍历list里的每一个S-expression,假设发现当中某个不是atom的,则返回f ...

  6. (76) Clojure: Why would someone learn Clojure? - Quora

    (76) Clojure: Why would someone learn Clojure? - Quora ★ Why would someone learn Clojure?   Edit

  7. jQuery遍历函数

    jQuery遍历函数包含了用于筛选.查找和串联元素的方法. .add():将元素加入到匹配元素的集合中. .andSelf():把堆栈中之前的元素集加入到当前集合中. .children():获得匹配 ...

  8. Design Pattern Memo 备忘录设计模式

    本设计模式就是简单地记录当前状态.然后利用记录的数据恢复. 比方首先我们有一个类.类须要记录当前状态进行相关的工作的: class Memo; class Human { public: string ...

  9. Merging a WPF application into a single EXE(WPF应用程序合并成单个Exe文件)

    I always dislike handing off little applications to people. Not because I can’t, but because of the ...

  10. hdu 2451 Simple Addition Expression(数位DP )成败在于细节

    亚洲区域赛的题,简单的数位DP题,注重细节. 任何细节都有可能导致wa,所以没有绝对的水题. 把握好细节,此题便A. #include<stdio.h> __int64 getans(__ ...