嵌入式C语言自我修养03:宏构造利器——语句表达式

  

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语言开发工程师。面试官给你出了一道题:

  

请定义一个宏,求两个数的最大值。

嵌入式C语言自我修养03:宏构造利器——语句表达式