zoukankan      html  css  js  c++  java
  • 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 ; })

    这样就可以减少计算次数

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

  • 相关阅读:
    iframe的边框如何去掉
    vue-computed计算属性用法
    Vue-input框checkbox强制刷新
    TED 积极心理学感悟(二)
    路由器使用子网掩码进行分组转发的过程
    DHCP 服务器和 DHCP 客户端的交互过程
    IPv4 协议中的 NAT 协议和 CIDR 协议
    IPv6 是解决 IPv4 地址耗尽问题的根本途径
    TED 积极心理学感悟
    初级错误之 for 中的局部变量
  • 原文地址:https://www.cnblogs.com/linghuchong0605/p/3838430.html
Copyright © 2011-2022 走看看