3.1基础复习:表达式,语句和代码块
<强>表达式强>
表达式和语句是C语言中的基础概念。什么是表达式呢?表达式就是由一系列操作符和操作数构成的式子。操作符可以是C语言标准规定的各种算术运算符,逻辑运算符、赋值运算符,比较运算符等。操作数可以是一个常量,也可以是一个变量。表达式也可以没有操作符,单独的一个常量甚至是一个字符串,也是一个表达式。下面的字符序列都是表达式:
-
<李> 2 + 3 李>
<李> 2李>
<李> i=2 + 3 李>
<李>我+ + + 3=李>
<李>“wit"李>
表达式一般用来数据计算或实现某种功能的算法。表达式有2个基本属性:值和类型。如上面的表达式2 + 3,它的值为5,根据操作符的不同,表达式可以分为多种类型,如:
-
<李>关系表达式李>
<李>逻辑表达式李>
<李>条件表达式李>
<李>赋值表达式李>
<李>算术表达式李>
<李>……李>
<>强语句强>
语句是构成程序的基本单元,一般形式如下:
<代码>表达式; 我=2 + 3;代码>
表达式的后面加一个;就构成了一条基本的语句。编译器在编译程序,解析程序时,不是根据物理行,而是根据分号;来判断一条语句的结束标记的。如我=2 + 3;这条语句,你写成下面的形式也是可以编译通过的:
<代码> i=2 + 3. ,代码>
<强>代码块强>
不同的语句,使用大括号{}括起来,就构成了一个代码块c语言允许在代码块里定义一个变量,这个变量的作用域也仅限于这个代码块内,因为编译器就是根据{}来做入栈出栈操作来管理变量的作用域的。如下面的程序:
<代码> int主要(空白) { int i=3; printf("我=% d \ n " i); { int i=4; printf("我=% d \ n " i); } printf("我=% d \ n " i); 返回0; } 运行结果为: 我=3 我=4 我=3 代码>
3.2语句表达式
<>强语句表达式的定义强>
GNU C对C标准作了扩展,允许在一个表达式里内嵌语句,允许在表达式内部使用局部变量,为循环和goto跳转语句。这样的表达式,我们称之为语句表达式。语句表达式的格式如下:
<代码>({表达式1;表达式2;表达式3;})代码>
语句表达式最外面使用小括号()括起来,里面一对大括号{}包起来的是代码块,代码块里允许内嵌各种语句。语句的格式可以是“表达式;“这种一般格式的语句,也可以是循环,跳转等语句。
跟一般表达式一样,语句表达式也有自己的值。语句表达式的值为内嵌语句中最后一个表达式的值。我们举个例子,使用语句表达式求值。
<代码> int主要(空白) { int和=0; 和=({ int s=0; for (int i=0;我& lt;10;我+ +) s=s +我; 年代; }); printf ("=% d \ n ",总和); 返回0; }代码>
在上面的程序中,通过语句表达式实现了从1到10的累加求和,因为语句表达式的值等于最后一个表达式的值,所以在为循环的后面,我们要添加一个年代;语句表示整个语句表达式的值。如果不加这一句,你会发现金额=0。或者你将这一行语句改为100;你会发现最后求和的值就变成了100年,这是因为语句表达式的值总等于最后一个表达式的值。
<>强语句表达式内使用goto跳转强>
在上面的程序中,我们在语句表达式内定义了局部变量,使用了对循环语句。在语句表达式内,我们同样也可以使用goto进行跳转。
<代码> int主要(空白) { int和=0; 和=({ int s=0; for (int i=0;我& lt;10;我+ +) s=s +我; 转到; 年代; }); printf ("=% d \ n ",总和); 在这里: printf (": \ n "); printf ("=% d \ n ",总和); 返回0; }代码>
3.3在宏定义中使用语句表达式
语句表达式的亮点在于定义复杂功能的宏。使用语句表达式来定义宏,不仅可以实现复杂的功能,而且还能避免宏定义带来的歧义和漏洞。下面就以一个宏定义例子,让我们来见识见识语句表达式在宏定义中的强悍杀伤力!
假如你此刻正在面试,面试职位是:Linux C语言开发工程师。面试官给你出了一道题:
请定义一个宏,求两个数的最大值。