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 ; })

    这样就可以减少计算次数

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

  • 相关阅读:
    【NIPS 2018】完整论文下载链接
    【今日CV 视觉论文速览】30 Nov 2018
    【超好玩的在线AI项目】浏览器里玩AI------持续更新
    hdu 4035 Maze 概率DP
    hdu 4089 Activation 概率DP
    hdu 4405 Aeroplane chess 概率DP
    zoj 3329 One Person Game 概率DP
    poj 2096 Collecting Bugs 概率DP
    poj 3744 Scout YYF I
    2013 Multi-University Training Contest 5 Partition
  • 原文地址:https://www.cnblogs.com/linghuchong0605/p/3838430.html
Copyright © 2011-2022 走看看