一 、c99数组部分特性
如:
int a1[3]={1,max(a,b),3}; /*数组第2个元素的值通过函数来确定*/
如:
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 */ |
(类型名称){初始化值列表,}
说明:
示例
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表示只翻译,不进行连接
评论