登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

仙剑奇侠传的博客

羽化成仙

 
 
 

日志

 
 

c99数组新特性之一(非常量表达式初始化数组)  

2011-08-27 19:38:53|  分类: C |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一 、c99数组部分特性

  1. 如果Ij是个可以作为T类型的对象的初始化值的表达式,则{I0,I1,……,In-1}可以作为"包含n个元素的T类型的数组"的初始化值列表,C99允许Ij是个非常量表达式,c99之前必须要求是常量表达式。即然是表达式,可以是常量表达式、关系表达式、逻辑表达式等都可。

    如:

    int a1[3]={1,max(a,b),3}; /*数组第2个元素的值通过函数来确定*/

  2. 指定成员的初始化值。c99允许在初始化值列表中指定需要初始化的聚合类型(结构、联合或数组)的成员。指定成员的初始化值和位置(必是一定是要求指定)初始化值可以混合出现在同一个初始化值列表中。数组采用[e]指定元素的位置。

    如:

int al[5]={[2]=100,[1]=3} ;/*{0,3,100,0,0} */

int a2[5]={[0]=10,[2]=-1,-1,-3} ;/* {10,0,-1,-1,-3} */

int a3[]={0,1,2,3,6,[2]=5}; /*{0,1,5,2,3,6} a3的长度是6 */

 

  1. 复合字面值。c99引入复合字面值的概念,用于表示聚合类型的无名常量。其由带括号的类型名称以及位于一对花括号内的初始化值列表组成。格式如下:

    (类型名称){初始化值列表,}

    说明:

    1. 值列表后面的逗号可选
    2. 类型名称最适合数组、结构、联合与枚举类型
    3. 可以加const限定符,创建只读的字面值
    4. 如果是数组类型,初始化值列表赋值规范参见上面2条

示例

int *p=(int []){1,2,[0]=6,5,7}

/*p指向的值是{6,1,2,5,7}指向的数组长度为5*/

char * pChar1=(char []){"abcdefg"};

/*pcahr1是一个指向字符串的指针,字符串可改*/

char * pChar2=(char []){"abcdefg"};

/* pcahr2是一个指向字符串的指针,字符串不可改*/

inline int pow2(int n){

{

assert(n>=0&&<=7);

return (const int[]){1,2,4,8,16,32,64,128}[n];

}

 

二、利用数组部分c99特性,实现一些应用

有些数组,其中的元素之间存在一些有规律的关系,传统code中需要定义好数组之后利用循环对数组元素逐个赋值。如数组元素之间关系是如下形式:1、1、2、3、5、8、13、21、34……,也就是当前元素是值是前两个元素之和;还可以有复杂的数组元素关系。

1、下面给出例子:

/*************************************************************

author:wsysoft@gmail.com

filename:arrayc.c

不用循环初始化数组,把数组元素之间的逻辑写在数组初始化代码中

功能1:本程序初始化数组为:当前元素值为前两个元素相加。

如数组:1,1,2,3,5,8,13……

功能2:初始化数组为:当前元素为前一个元素的两倍

输出结果为:

1 1

1 2

2 4

3 8

5 16

8 32

13 64

 

************************************************************/

int ArraySum(int,int );

#include<stdio.h>

int main(void){

int *b=(int [7]){0,};/*复合字面值*/

int *c=(int [7]){0,};

int *p=(int []){

     *(b+0)=1,

     [1]=(*(b+1)=ArraySum(1,0)),

        /*表达式中调用函数*/

     [2]=*(b+2)=ArraySum(*(b+1),(*b)),

        /*数组值列表中的位置属性[e]可以省略*/

        (*(b+3)=(*(b+2)+*(b+1))),

        [4]=(*(b+4)=(*(b+3)+*(b+2))),

     [5]=(*(b+5)=(*(b+4)+*(b+3))),

     [6]=(*(b+6)=(*(b+5)+*(b+4)))

     };

int *m=(int []){[0]=(*(c+0)=1),

     [1]=(*(c+1)=2*(*(c+0))),

     [2]=(*(c+2)=2*(*(c+1))),

     [3]=*(c+3)=2*(*(c+2)),

     [4]=*(c+4)=2*(*(c+3)),

        [5]=*(c+5)=2*(*(c+4)),

     [6]=*(c+6)=2*(*(c+5))

     };

/*以下代码遍历数组,实际中要把数组指针归位到首元素*/

int i ;

for(i=0;i<7;i++){

     printf("%d\t",*p++);

     printf("%d\n",*m++);

}

 

return 1;

}

 

int ArraySum(int a,int b ){

    return a+b;

}

2、不同的编译器编译

1)用gcc,本代码在MinGW4.5.2中编译通过,编译指令为:

gcc -o arrayc.exe arrayc.c -Wall -std=c99 –pedantic

 

指令输出:无

说明:-std=c99表示采用c99标准进行编译 –pedantic检查代码是否符合标准c规范。

2)用intel c++10.1.021版本进行编译,指令是:

icl /Qstd=c99 arrayc.c /c

指令说明如下:

/Qqstd=c99表示采用c99 标准进行编译, /c表示只翻译,不进行连接

  评论这张
 
阅读(1126)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018