语句和块(二)
二、标签语句
标签(label)存在以下三种语法格式:
attribute-specifier-sequenceopt identifier : attribute-specifier-sequenceopt case constant-expression : attribute-specifier-sequenceopt default :
其中attribute-specifier-sequence是属性说明符序列;identifier是标识符;constant-expression是常量表达式;case和default是C语言关键词。
复合语句中的任何语句或者声明之前都可以添加一个将标识符声明为标签名(label name)的前缀。同一函数内标签名是唯一的。
int i = 0; here : //here :是标签,here是标签名。 i++; if(i<3) goto here;
case标签和default标签仅用于switch语句。
switch(i) { case 0 : puts("i is equal to 0."); break; default : puts("i is not equal to 0."); break; }
标签中可选的属性说明符序列适用于标签。标签本身不会改变控制流,控制流可以不受阻碍地穿过标签继续执行。编译时标签视为其后跟一条空语句。
int i = 0; here : printf("i = %d\n", i); i++; if(i<3) goto here;
将输出:
i = 0 i = 1 i = 2
三、复合语句
复合语句(compound statement)具有以下语法格式:
{ block-item-listopt }
其中block-item-list是块项目列表;块项目可以是声明、无标签语句或者标签。
如果复合语句是函数体,复合语句与函数形参类型列表以及两者间的可选属性说明符序列一起构成函数定义相关联的块;如果复合语句不是函数体,复合语句是一个不同于其它任何块的块。
//复合语句是函数体。 int func(int i) { return i; } ... //复合语句不是函数体。 { for(int i=0; i<3; i++) printf("%d\n", i); }
四、表达式语句
表达式语句(expression statement)具有以下语法格式:
attribute-specifier-sequenceopt expression;
其中attribute-specifier-sequence是属性说明符序列;expression是表达式。
表达式语句中可选的属性说明符序列适用于表达式。表达式语句中的表达式作为空表达式(void expression)进行评估,以产生副作用(例如:赋值、具有副作用的函数调用等。)。
i = 5; //等价于(void)(i = 5);,副作用是给变量i赋值。 puts("China"); //等价于(void)puts("China");,副作用是执行了输出操作。
五、空语句
空语句(null statement)具有以下语法格式:
;
空语句仅由一个分号(;)构成,不执行任何操作。空语句的主要用途是占位,以满足语法要求。
int i = 0; ... while(i++ < 5) ; //空语句。