第二章语法陷阱
2014-04-26 22:28
218 查看
一、函数指针
1.我们先来看一下,一下几个表达式的区别:
2.接下来,我们来看一个函数指针的例子:
3.最后我们来分析一个稍微复杂一点的例子
这个式子的含义是什么呢?这个应该怎么分析呢?
我们可以这样来看:令p = (void(*)())0;则原式可表示为 (*p)();这样显然是用函数指针p来调用一个函数,下面我们再具体看一下p的含义,p表示一个函数指针,void(*)()是一个强制类型转换,p表示的是将0转换为指向返回类型为void型函数的一个函数指针。
二、运算符优先级问题
一个小例子:
三、注意作为语句结束符的分号
1.多写分号引起的问题:
四、else悬挂引起的问题:
这段代码原意是第一个if与else匹配,但是,由于没有括号,导致第二个if与else匹配,条件判断出错。
1.我们先来看一下,一下几个表达式的区别:
int *a;//表示一个指向int型数的指针
int *a();//即int *(a());a是一个函数,函数a的返回值为一个int型的指针
int (*a)();//a是一个函数指针,表示指向返回值为int型的函数指针
(int (*)());//表示一个“指向返回值为int型的函数指针”的类型转换
2.接下来,我们来看一个函数指针的例子:
#include <stdio.h> void fun() { puts("hello world!"); } int main() { void (*p)() = fun;//函数指针 //两种用法 p(); (*p)(); return 0; }运行结果如下:
3.最后我们来分析一个稍微复杂一点的例子
(*(void(*)())0)();
这个式子的含义是什么呢?这个应该怎么分析呢?
我们可以这样来看:令p = (void(*)())0;则原式可表示为 (*p)();这样显然是用函数指针p来调用一个函数,下面我们再具体看一下p的含义,p表示一个函数指针,void(*)()是一个强制类型转换,p表示的是将0转换为指向返回类型为void型函数的一个函数指针。
二、运算符优先级问题
一个小例子:
while(c = getchar() != EOF) {};//相当于while(c = (getchar() != EOF)) {};显然,这不是这段代码的原意 while((c = getchar()) != EOF) {};
三、注意作为语句结束符的分号
1.多写分号引起的问题:
if(a > b); b = a;//相当于 if(a > b) {}; b = a;无论什么情况,赋值语句都会执行 if(a > b) b = a;
四、else悬挂引起的问题:
if(0 == x) if(0 == y) f(); else { z = x + y; }
这段代码原意是第一个if与else匹配,但是,由于没有括号,导致第二个if与else匹配,条件判断出错。
相关文章推荐
- 《c陷阱与缺陷》第二章,语法陷阱
- c缺陷与陷阱笔记-第二章 语法陷阱
- 《C陷阱与缺陷》 第二章 语法“陷阱”
- C陷阱与缺陷第二章 语法“陷阱”
- 第二章 语法陷阱
- 第二章 语法“陷阱”
- 《再读》第二章 语法“陷阱”
- C陷阱与缺陷 —— 读书笔记-2、语法“陷阱”
- Kotlin Primer·第二章·基本语法
- 【JSP笔记】第二章 JSP基础语法
- Java私塾跟我学系列――JAVA篇 第二章 基础语法
- JavaScript语法中12个需要绕开的陷阱
- 第二章 标准语法
- 【编译原理】第二章 一个简单的语法制导翻译器
- C++ FAQS 翻译3 (第一部分 预备知识 第二章 C++语法和语义基础)
- Swift专栏:第二章 Swift基础语法(二)
- luogg_java重新学习_第二章,基本语法03(数组)
- DOM编程艺术第二章 JavaScript语法
- 第二章 JAVA语言基本语法————数据类型之间的转换
- Java私塾跟我学系列――JAVA篇 第二章 基础语法