当前位置: 首页 > 科技观察

C语言的“六大陷阱”,你可能已经知道两个

时间:2023-03-13 08:07:23 科技观察

前戏要理解一个C程序,仅仅理解组成程序的符号是不够的,我们还需要理解这些符号是如何构成语句的,表达式、语句和程序。今天我们将讨论不同的语法结构。1、正确理解函数声明你见过这样的代码“(*(void(*)())0)();”,你能知道它的意思吗?看不懂也不用着急,下面我们稍微分析一下:任何C变量的声明都由两部分组成:类型和一组类似表达式的声明符(declarators)。从表面上看,声明器类似于鱼表,但它应该只返回语句给出的结果。(void(*)()0)将常量0转换为“指向返回值为void的函数的指针”类型。和(*(void(*)())0)();可以看作是一个函数调用,最后的分号使表达式成为一个语句。当然我们也可以使用typedef来让afterlife的表达更清晰:typedefvoid(*funcptr)();(*(funcptr)0)();2、运算符的优先级在C语言中,运算符的优先级有15种如果我们不知道运算符的优先级,我们在处理问题和分析代码时很被动,那么我们可以简单地将运算符分组,了解它们之间的相对优先级每组运算符,那么记起来就比较简单了,可以简单记为:!>算术运算符>关系运算符>&&>||>赋值运算符。3.语句末尾的分号问题C语言使用分号“;”作为语句结束的标志,那么如果在表达式后面多写一个分号,会发生什么情况呢?这个分号可能被认为是一个没有任何实际作用的空语句,或者编译器会因为多出的分号而产生警告信息,可以根据警告信息去掉。但一个例外是在if或while语句之后多写一个分号。这时候if或者while后面的原语句就是一个单语句,fish条件判断就没有任何关系了。请看一下代码:If(x>y)return;如果(x>y);返回;这两句话是完全不同的。4.switch语句问题在C语言的switch中,一个break;case分支后面需要加statement,否则会知道会执行statement,达不到预期的效果。5.函数调用不同于其他编程语言。C语言要求在调用函数时,即使函数没有参数,也应该包含一个参数列表。因此,如果f是一个函数,f();是函数调用,f;这是一个什么都不做的声明。6.else挂起问题我们经常听说else要和if配对,但是我们在写代码的时候还是经常会出错,比如下面的代码:这段代码的本意是分为两种情况,x相等to0和notequalto0,但是上面的代码表达了完全不同的意思。即不等于0,程序不处理。当x等于0时,判断y的值,做不同的处理。