当前位置: 首页 > news >正文

正安县住房和城乡建设局网站律师免费咨询电话

正安县住房和城乡建设局网站,律师免费咨询电话,北京建站模板厂家,wordpress 评论倒叙#x1f4af;#x1f4af;#x1f4af; 要理解一个C程序#xff0c;必须理解这些程序是如何组成声明#xff0c;表达式#xff0c;语句的。虽然现在对C的语法定义很完善#xff0c;几乎无懈可击#xff0c;大门有时这些定义与人们的直觉相悖#xff0c;或容易引起混淆… 要理解一个C程序必须理解这些程序是如何组成声明表达式语句的。虽然现在对C的语法定义很完善几乎无懈可击大门有时这些定义与人们的直觉相悖或容易引起混淆。语法细节决定语义本篇总结C语法陷阱中的诸多细节以供参考。导言Ⅰ. 理解函数的声明1.1函数的声明1.2类型转换1.3规则Ⅱ. 运算符的优先级问题2.1不同类型的运算符优先级问题优先级最高() [ ] .第二高单目第三高双目2.2同类运算符之间相对优先级问题Ⅲ. 函数调用Ⅳ. 注意作为语句结束标志的分号Ⅴ. “悬挂”else引发的问题Ⅵ. switch语句导言 由于一个程序错误可以从不同层面采用不同方式进行考察而根据程序错误与考察程序的方式之间的相关性可以将程序错误进行划分为各种陷阱与缺陷 ①.词法“陷阱” ②.语法“陷阱” ③.语义“陷阱” ④.连接问题 ⑤.库函数问题 ⑥.预处理器问题 ⑦.可移植性缺陷 Ⅰ. 理解函数的声明 *void(*)()0();你知道这个表达式表示什么吗 调用一个首地址为0的函数。 要理解这个表达式我们需要从两个方面入手函数如何声明的与类型如何转换的。 1.1函数的声明 任何C变量的声明都是由两部分组成类型以及变量。 float f,g;这个声明的含义是当对其求值时表达式f和g的类型为浮点数类型 float ff();这个声明的含义是表达式ff()求值结果是一个浮点数也就是说ff是一个返回值为浮点数类型的函数。 float *pf;这个声明的函数是*pf是一个浮点数也就是说pf指向的数是个浮点数。pf是一个指向浮点数的指针。 float *f(), (*h)();同理那*f() ,(*h)(),就是浮点表达式 因为函数调用()结合优先级是高于解引用 * *f(),也就是 *f():f是个函数,返回值是一个指向浮点数的指向。 h呢是一个函数指针h指向的函数的返回值是浮点类型。 如果假设pf为函数指针那么如何调用fp所指向的函数呢? 首先pf就是指针指向的函数那么对它调用就可以了。 不过注意要这样写*pf(); 因为函数运算符()的优先级高于单目运算符。如果pf两侧没有括号那么 pf就与 pf一样了。 那我们如果想调用一个首地址为0的函数应该如何调用呢 这样(* 0)(); 上式并不能生效因为运算符必须要一个指针来做操作数。 而且这个指针还应该是一个函数指针这样经过运算符作用后的结果才能能作为函数被调用。 所以必须要对上式的0进行类型转换。 转换的发现我们可以描述为指向函数值为void参数为void的函数的指针。 也就是这个0必须转换为函数指针而这个函数指针指向的函数参数为void返回值也为void。 那该如何转换呢 1.2类型转换 其实我们一旦找到任何声明一个给定类型的变量那么该类型的类型转换符就很容易得到了只要将声明中的变量名和声明末尾的分号去掉再将剩余的部分用一个括号整个封装起来即可。 float (*pf)();pf表示的是一个指向函数指针指向的是函数参数是void,返回值为float。 也就是指向返回值为浮点类型的函数的指针。 而float (*)()去掉变量名与分号 再加上一个括号( float (*)() ) 这就表示一个“指向返回值为浮点类型的函数的指针”的类型转换符。 所以我们如果将0类型转换为“一个指向返回值为void的函数的指针”类型就首先要知道一个该类型是如何声明。 如果pf是一个指向返回值为void类型的函数指针那么(*pf)()的值为voidpf的声明如下 void (*pf)();所以该类型的类型转换符为 ( void (*)() )所以将0强制类型转换为“指向返回值为void的函数指针”则为如下表示 ( void (*)() )0 而对于该函数指针要是调用该函数指针所指向的函数的话应该如下表示 (*( void (*)() )0)();所以该表达式表达的也就是调用一个函数该函数的首地址为0返回值为0参数也为0. 1.3规则 按照使用的方式来声明 Ⅱ. 运算符的优先级问题 2.1不同类型的运算符优先级问题 运算符优先级有那么多记住它们并不是一件容易的事 所有以我们应该对它们进行恰当的分组理解各组运算符之间的相对优先级。这样记忆起来就很快了。 优先级最高() [ ] . 优先级最高的其实并不是真正意义上的运算符包括数组下标函数调用操作符结构体成员访问操作符。它们都是从左向右结合的。所以a.b.c的含义是a.b.c 第二高单目 单目运算符的优先级仅次于前述运算符。 在所有真正意义上的运算符中它们的优先级最高。因为函数调用的优先级要高于单目运算符的优先级。 类型转换()也是单目运算符它的优先级和其他单目运算符的优先级一样。单目运算符是自右向左结合因此*p会被编译器解释为 *(p即p的地址1而不是p指向的对象1 第三高双目 优先级比单目运算符要低的接下来就是双目运算符。双目运算符中算术运算符的优先级最高移位运算符次之关系运算符再次之接着解释逻辑运算符赋值运算符最后是条件运算符。 我们需要记住的两点就是 任何一个逻辑运算符的优先级低于任何一个关系运算符移位运算符的优先级比算术运算符要低但是比关系运算符高。 算术移位关系逻辑赋值条件 2.2同类运算符之间相对优先级问题 属于同一类型的各个运算符之间的相对优先级理解起来一般没有什么困难。但是6个关系运算符的优先级并不相同。 1.运算符和的优先级要低于其他关系运算符的优先级。 因此我们如果要比较a与b的相对大小顺序是否和c与d的相对顺序一样就可以这样写 abcd2.任何两个逻辑运算符都具有不同的优先级。所有的按位运算符优先级要比顺序运算符的优先级高每个与运算符要比对应的或运算符优先级高而按位异或^运算符的优先级介于按位与运算符和按位或运算符之间。 3.在所有的运算符中三目条件运算符优先级最低。这就可以在条件运算符的条件表达式中包含关系运算符的逻辑组合因为先处理的是关系运算符最后再处理三目条件逻辑符。 4.所有的赋值运算符的优先级是一样的而且它们的结合方式是从右到左。 所以 ab0; 与 b0; ab; 表达的意思是一样的。5.在所有的运算符中逗号运算符的优先级最低。 Ⅲ. 函数调用 C语言要求在函数调用的时候即使函数不带参数也要将函数参数列表括号写下来。因此如果 f 是一个函数f();则表示一个函数调用语句而f却是一个什么都不做的语句这个语句虽然计算函数f的地址但不调用该函数。 Ⅳ. 注意作为语句结束标志的分号 在C语言中如果不小心多写了一个分号可能不会造成什么不良后果 1.这个分号可能会被视为一个不会产生任何实际效果的空语句 2.或者编译器会因为这个分号产生警告信息根据信息去掉这个分号。 但也会有例外发现有时会造成很大的差别 1.如果在if或者while语句之后多了一个分号那么原来紧跟在if或者while之后的语句就是一个单独的语句与条件判断部分没有任何关系了。 2.当不是多写了一个分号而是遗漏一个分号同样会招致麻烦比如return 语句后面的分号忘记写了则会将return 后面的语句作为操作数进行返回。 3.当一个声明的结尾紧跟一个函数定义时如果声明结尾的分号被省略编译器可能会把 声明的类型视为函数的返回值类型。 Ⅴ. “悬挂”else引发的问题 C语言中规定else始终与同一对括号内最近的未匹配的if结合。 也就是就近原则它会和离它最近的if相结合。当然这必须在同一个括号里。如果在不同的括号里那么就不遵循了。 int main() {int a 0, y 1;if (a 0)if (y 0)printf(正确\n);else{printf(错误\n);}return 0; }比如第一个if里面的判断条件为a是否等于0 该代码的本意是else为a不为0时进行的代码但真正的是else与第二个if相匹配了 也就是else里的判断条件变成了y不为0时进行的代码。 如果要得到原来的例子中编程者本意的结果应该这样写 int main() {int a 0, y 1;if (a 0){if (y 0)printf(正确\n);}else{printf(错误\n);}return 0; }现在else与第一个if结合即使它离第二个if更近也不会改变因为此时第二个if已经被括号“封装”起来了。 Ⅵ. switch语句 switch语句的特点就是包含break当遇到break语句立刻结束。 C语言中switch语句的这种特性既是它的优势也是它的一大弱点。说它是弱点是因为程序员很容易遗漏各个case部分的break语句造成一些难以理解的程序行为。 说它是优势是因为如果程序员有意的省略一个break语句就可以表达出一些采用其他方式很难方便地加以实现的程序控制结构。 特别是对于一些大的swtich我们经常发现各个分支的处理大同小异对于某个分支情况的处理只要稍作修改或者不修改就也符合程序的要求。 比如这样的一段代码它的作用是查找符号时跳过程序中的空白字符在这里空格键制表符换行符的处理都是相同的除了遇到换行符时程序的代码行计数器需要进行递增。其他都是一样所以我们可以省略break程序照样可以运行甚至更好。 case \n:linecount;//该处省略break语句case \t:case :
http://www.hkea.cn/news/14322603/

相关文章:

  • 诚信网站建设的意义wordpress文库主题
  • 阿里巴巴新网站怎么做运营网站模板 手机
  • 网页的基本布局抖音seo排名系统哪个好用
  • 小学网站建设实施方案广州公司注册网址
  • 建湖做网站哪家公司好网络服务器忙请稍后再试3008
  • 培训中心网站建设wordpress获取分类下文章列表
  • 静态网站更新上海工商网企业信息查询系统官网
  • 瑞安 网站建设培训班竞价网站单页面
  • 网站建设的案例山西忻州市忻府区
  • 广东公司响应式网站建设报价会同县做网站
  • 简述阐述网站建设的步骤过程刚做的网站多久能被搜索到
  • 2014网站设计做网站有发展吗
  • 建设营销型网站流程图流量精灵官网
  • 网站上线稳定后的工作工业产品设计与创客实践赛题库
  • 建设营销网站的四个步骤零基础可以做网站吗
  • 高端网站设计报价表凡科网怎么建网站
  • 做网站余姚百度关键词查询工具免费
  • 免费的行情软件网站不用下载wordpress is page
  • 怎样不用代码就能建网站淘宝客网站需要备案吗
  • 小程序简单还是做网站简单企业官方网站怎么写
  • 网站设计实训心得体会视觉设计包括什么
  • 网站建设流程公司wordpress knowhow 下载
  • 企业网站建设兴田德润实惠搜索引擎在线
  • 北京建站模板厂家做外贸都用什么网站
  • 定制网站建设多少钱秀屿网站建设
  • 网站建设数据库设计河南网站备案所需资料
  • 手机网站建设策划方案怎么搭建网页服务器
  • cnnic可信网站必须做吗?中天建设集团有限公司资质等级
  • 想学做网站可以自学吗做网站心得体会
  • 安徽网站开发推荐vps 网站打不开