要理解一个C 程序,仅仅理解组成该程序的符号是不够的,我们还需要理解这些符号是如何组成声明、表达式、语句和程序的。今天我们就来讨论一下C语言中不一样的语法结构。

1. 正确理解函数声明
你是否见过这样的代码“(*(void(*)())0)();”,你能知道这是上面意思吗?
看不懂不用担心,下面我们来分析一下:任何C变量的声明都由两部分组成:类型以及一组类似表达式的声明符(declarator)。声明符从表面上看鱼表发挥有些类似,对他就只应该返回一个声明给定的结果。(void (*)()0)是将常数0 转型为“指向返回值为void 的函数的指针”类型。而(*(void(*)())0)();就可以看成是一个函数调用,末尾的分号使得表达式成为一个语句。当然我们也可以使用typedef来世表达式更加清晰:
typedef void (*funcptr)();
(*(funcptr)0)();
2. 运算符的优先级问题
在 C语言中,运算符优先级有15个之多,如果不知道运算符的优先级我们在处理问题,分析代码时,就非常被动,那么我们可以对运算符进行简单的分组,了解各组运算符之间的相对优先级,那么记起来就相对简单了,可以简单的记做:!> 算术运算符 > 关系运算符>&&>|| > 赋值运算符。
3. 语句结束符的分号问题
C语言以分号“;”,作为语句结束的标志,那么如果在表达式后多写了分号,会出现什么结果呢?这个分号也许会被视作一个不会产生任何实际效果的空语句,或者编译器会因为这个多余的分号产生一条警告信息,可以根据警告信息去掉这个分号。但一个例外就是在if 或者while语句之后多写一个分号,此时原来在if或者while之后的语句即使一条单独的语句,鱼条件判断没有了任何关系。请看一下代码:
If(x > y)return;
If(x > y);return;
这两句完全是不一样的
4. Switch 语句问题
C语言中的switch,在case分支后都需要添加一个break;语句,不然会已知顺着语句执行下去,达不到我们需要的效果。
5. 函数调用
与其他程序设计语言不同,C语言要求:在函数调用时及时函数不带参数,也应该包含参数列表,因此,如果f 是一个函数,f();一个函数调用,而f;却是一个什么也不做的语句。
6. else 悬挂问题
我们经常听到说else要和if 配对使用,然而在我们写代码时,还是会经常出错,例如如下代码:
这段代码的本意是分为两种情况,x 等于0 不等于0,然而上面的代码表达的意思却截然不同。即 想不等于0,程序不做处理,x 等于0时,判断y的值,做出不同的处理。
热门课程
专业讲师指导 快速摆脱技能困惑相关文章
多种教程 总有一个适合自己专业问题咨询
你担心的问题,火星帮你解答为给新片造势,迪士尼这次豁出去了,拿出压箱底的一众经典IP,开启了梦幻联动朱迪和尼克奉命潜入偏远地带卧底调查 截至11月24日......
此前Q2问答环节,邹涛曾将《解限机》首发失利归结于“商业化保守”和“灰产猖獗”,导致预想设计与实际游玩效果偏差大,且表示该游戏......
2025 Google Play年度游戏颁奖:洞察移动游戏新趋势
玩家无需四处收集实体卡,轻点屏幕就能开启惊喜开包之旅,享受收集与对战乐趣库洛游戏的《鸣潮》斩获“最佳持续运营游戏”大奖,这不仅......
说明:文中所有的配图均来源于网络 在人们的常规认知里,游戏引擎领域的两大巨头似乎更倾向于在各自赛道上激烈竞争,然而,只要时间足......
在行政服务优化层面,办法提出压缩国产网络游戏审核周期,在朝阳、海淀等重点区将审批纳入综合窗口;完善版权服务机制,将游戏素材著作......
未毕业先就业、组团入职、扎堆拿offer...这种好事,再多来一打!
众所周知,火星有完善的就业推荐服务图为火星校园招聘会现场对火星同学们来说,金三银四、金九银十并不是找工作的唯一良机火星时代教育......
同学您好!