• gcc扩展语法一:在表达式中的语句和声明


    在GNU C中包含在括号中的复合语句可以作为一个表达式。这就允许你在表达式中使用循环,switch和局部变量。

    以前复合语句是包含在大括号中语句序列。在这种构造中,圆括号包围在大括号中。如下面的例子:

    ({ int y = foo(); int z;

      if ( y > 0 )  z = y;

      else  z = -y; 

         z;

    })

    上面的例子是一个有效的表达式。在复合语句构造中的最后一部分应该是一个表达式后面跟一个分号,这个子表达式的值充当整个复合语句构造的值。如果你使用的是其他类型的语句放在括号中的最后面,那么这个复合语句构造的类型为void类型,也就是没有返回值。

    这种复合语句构造对于宏定义安全特别有用。比如下面的例子:

      #define max(a,b)     ( (a) > (b) ? (a) : (b) )

      在上面的例子中a或者b的计算会进行两次,如果这种计算操作会产生副作用,那么会产生坏的结果。

      但是在GNU C中,你可以使用下面的方式,如果你知道a和b的类型的话,假设都为整型:

      #define max(a,b)     ({ int _a = (a), _b = (b); _a > _b ? _a : _b;})

      如果不知道a和b的类型的话,那么可以使用typeof语句,如下:

      #define max(a,b)    ({ typeof (a) _a = (a); typeof (b) _b = (b); _a > _b? _a : _b ; })

    这样就可以减少计算次数

    这种嵌套的语句不允许在常量表达式中。

  • 相关阅读:
    CSS-16-margin值重叠问题
    CSS-15-定位
    CSS-14-浮动
    CSS-13-块级元素和行内元素
    CSS-12-盒子模型
    CSS-11-外边距
    CSS-10-内边距
    CSS-09-背景属性
    CSS-08-边框属性设置
    CSS-07-CSS文本设置
  • 原文地址:https://www.cnblogs.com/linghuchong0605/p/3838430.html
Copyright © 2020-2023  润新知