在进行完“词法分析”完之后,我们知道了组成程序的“符号”
但是,我们还需要进一步的讨论如何合成,“声明”、“表达式”、”语句“和”程序“。
这就涉及到了“优先级”什么的,我们先开始讨论“语法分析”

一、理解函数声明

本节有2个可取之点:
1、相比“谭浩强”书中讲解优先级的角度,本节给了一个新视角来理解“符号”之间的组合
2、介绍了一种,返回值为“函数指针”的方法,便于帮助我们理解Linux系统编程的底层代码

此外:
书中强调了,ANSI C标准允许程序员将函数指针简写为fp(),但是要记得这种写法是一种简写形式。最初是(*fp)()

二、运算符的优先级问题

本节告诉我们,记住C语言中运算符的优先级是有益的。
特别是其中的讲解,结合其中几句话和分析过程,我可以结合我自己写的另一篇记忆博客。
记得更加深刻。

1)C语言优先级摘录:

1、优先级最高者其实并不是真正意义上的运算符,包括:数组下标( [ ] )函数调用( ( ) )、操作符各结构成员选择操作符( . 和 ->)
2、类型转换也是单目运算符
3、逗号运算符的优先级最低,原因在于:
逗号运算符常用于在需要一个表达式而不是一条语句的情形下替换语句结束标志的分号。
4、六个关系运算符的优先级并不相同的原因是:历史原因
5、位运算的优先级不同的因是:历史原因

2)我的记忆C语言优先级的文章

博客传送门

三、注意作为"语句结束标志"的分号( ; )

本节本来只是强调C语言中有的语法,需要记得加上分号或者不要多添加分号。
笔者从中看到的却是,本部分解答了我学C语言的时候的一个奇怪的疑问:

  • 为什么结构体定义中{ }后面要加分号( ; )呢?但是在函数定义{ } 却不用加分号( ; )呢?

解答:因为存在如下的写法

struct 
{
  int a;
  int b;
  int c;
} //此处故意没写分号;
test()    //此处函数,故意shen
{
    printf("OK\n");
}

这样一来,我们的函数test就有返回值为无名struct类型之嫌、
这也时为什么C语言和C++中,结构体和类定义完之后,为什么需要在最终加上;的原因。

PS:
1、结构体支持没有名字的定义方式
2、C语言中函数要是缺省返回值,则默认返回值是int,但是请注意,在ISO C++中却是不准的!!!

//保存为.c文件可以运行,但是.cpp就不OK了
//测试环境DevC++ 5.9.2
#include<stdio.h>

test()
{
     printf("OK\n");
     return 11;
}

int main()
{

    int a=1;
    a<<=1;
    printf("%d\n",a);
    test();
    return 0;
}

四、switch

大概告诉我们C语言把case当做真正意义上的标号,其实是双刃剑,用得好挺好,用不好,自找麻烦。

  • 产生bug的原因大概是以下几种
    • 1、语法等基础知识理解和记忆不到位
    • 2、思维的混乱性
    • 3、代码编写训练不到位

五、函数调用

无补充和评价

六、“悬挂”else引发的问题

附)总结