前面讲述了很多的C语言运算符,其中每一个运算符的使用会构成一个表达式,即有赋值表达式、算术表达式、关系表达式、逻辑表达式、位运算表达式、条件表达式、逗号表达式等。不光这些运算符能构成表达式,函数调用也可以称为C语言的表达式,而C语言中最简单的表达式莫过于单个的常量值,如整型常量“10”、字符常量'A'等。
C语言中每个表达式都会产生一个值,例如最简单的表达式的值是常量值,赋值表达式的值是最终左操作数的值,而关系表达式和逻辑表达式的值非0(假)即1(真)。
表达式中若含有运算符,那么根据运算符优先级的不同,表达式的求值顺序也会发生变化,不过我们可以通过“( )”来改变优先级。例如一个算术表达式:2 + 3 * 5,由于乘法的优先级比加法高,所以会先计算3 * 5,然后再将结果15与2相加,得到整个表达式的值17。在一个表达式中的各运算符的优先级情况如表2.15所示。
表2.15 运算符优先级
我们把这些运算符按照优先级的不同划分为15个等级,1级为最高优先级,15为最低优先级。另外,需要注意的是表中的最后一项“结合性”,所谓结合性就是当一个表达式中出现了多个同一优先级的运算符时的求值顺序,例如“3+4–5”,这个表达式中的两个运算符“+”和“–”具有相同的优先级,那么就按照从左至右的顺序进行运算,即先求“3+4”,得出结果7,然后再求“7–5”,最终表达式的值为2。而对于“a=b=10”这样的表达式也是合法的,因为赋值运算符的结合性是从右至左,所以首先会把10赋给变量b,然后再把变量b的值赋给变量a,而整个表达式的值就是变量a的值。
当我们去欣赏一篇文章时,总是从头一句一句细细地阅读,从中品味作者的思想和意境。C程序也是如此,程序启动后通过不断地执行语句来实现所要达到的功能。对于文章,通常都是以一个句号“。”来表示一句话的结束,而C程序代码则是以一个分号“;”来表示一个语句的结束。假如我们在一个表达式后面加上了分号,就构成了一条C语言的表达式语句,例如:
第一条语句的作用是定义了一个整型变量a,并把常量值10初始化给了它;第二条语句的功能是计算三个数相加的和,但这个结果没有被使用,所以这样的语句对于程序而言没什么实质性的作用,仅仅说明了它是一条语句,徒增代码量而已。我们可以称之为“垃圾语句”,大家在以后所写的代码中不要出现这样的“垃圾语句”。
不过,在C语言中可以有只包含一个分号的语句,我们称为“空语句”,通常会出现在一个循环中。关于循环我们后面会讲到,现在只研究这个空语句,它和前面所讲的垃圾语句有所不同。在程序中若出现垃圾语句会让代码的阅读者一头雾水,产生疑问。是不是代码写错了?它的作用和意义是什么?虽然空语句和垃圾语句一样也没什么实际功能,但代码阅读者看到空语句就会明确地知道编写者的意图:哦!原来这儿什么事情都不用做。
在第一个C程序中,我们在主函数里有这样一条语句:
我们在主函数中调用了标准库里的printf函数,这样的语句就称为函数调用语句。这种语句的作用是让程序通过函数的调用来实现某些特殊的功能,例如这里使用printf函数在控制台窗口上打印输出一条信息。关于这个printf函数的强大功能,我们在下一小节会详细讨论。
除了表达式语句、空语句和函数调用语句之外,C语言中还有标签语句、流程控制语句等等,这些语句将在后面的章节中进行学习。最后,讲一下C语言中比较特殊的一种语句:复合语句。
在C语言中,把一条或多条语句用大括号“{}”括起来就构成了复合语句。我们甚至可以把一个复合语句看成是单条语句,也就是把复合语句中的所有语句看成是一个整体,程序执行的时候,复合语句中的所有语句要么都被执行,要么都不被执行。在第3章的分支和循环里会经常用到这种复合语句。