语句表达式
GNU C
对C
语言标准作了扩展,允许在一个表达式里内嵌语句,允许在表达式内部使用局部变量、for
循环和goto
跳转语句。
({表达式1; 表达式2; 表达式3})
表达式最外面使用()
,里面使用{}
括起来代码块。
#include <stdio.h>
int main()
{
int sum = 0;
sum = ({
int s = 0;
for(int i = 0; i < 10; i++)
s += i;
s; // 语句表达式的值等于最后一个表达式的值
});
printf("sum = %d\n", sum);
return 0;
}
语句表达式的使用
语句表达式主要的用途在于定义功能复杂的宏。
#define MAX(x, y) ((x) > (y) ? (x) : (y))
上面这个表达式虽然可以使用,但是面对MAX(i++, j++)
仍然会出现问题,一般我们传递给宏的参数是不允许改变的,但是还是难免会遇到不遵循这条的小伙子。
int i = 2;
int j =6;
MAX(i++, j++) ==> (i++)> (j++) ? (i++): (j++) = 7
那么要怎样去避免这种情况尼,使用临时变量。、
#define MAX(x, y) ({ \
int _x = x;
int _y = y;
_x > _y ? _X : _y;
})
使用局部变量_x
和_y
来存储宏参数x
和y
的值,然后使用_x
和_y
来比较,这样就避免了i j
的自增运算带来的问题。但是使用int
类型,这就限制了使用范围;
#define MAX(type, x, y)({ \
type _x = x;
type _y = y;
_x > _y ? _x : _y;
})
但是使用了type
来表示传递的数据类型。
使用typeof
就可以,typeof
是GNU C
新增的字段,用来获取数据类型,
#define MAX(x, y) ({ \
typeof(x) _x = x; \
typeof(y) _y = y; \
(void) (&_x == &_y); \
_x > _y ? _x : _y; \
})
(void) (&_x == &_y)
作用有两个,一是给用户提示一个警告,对于不同类型的指针比较,编译器会发出一个警告,提示两种类型不同。二是两个数进行比较运算,运算结果没有用到,有的编译器会给出一个``warning,加上void
就可以消除这个警告。