c语言问题:我想用递归的方法给一个const型数组初始化 200
比如consta[3]={0,a[0]+1,a[1]+1};我想用宏定义#defineaa(a)a[a-1]+1consta[3]={0,aa[1],aa[22]};但不...
比如 const a[3]={0,a[0]+1,a[1]+1};
我想用宏定义 #define aa(a) a[a-1]+1
const a[3]={0,aa[1],aa[22]};但不行哎,求高手指教。
分不是问题主要是求教育啊
坐等高手 手把手教育啊3楼教育得是 那我从新写下吧
#define aa(a) a[a-1]+1
const a[3]={0,aa(1),aa(2)};
意义就在于当这个宏运算很复杂的时候,数组又很长的时候 以至于我手动去求值根本不可能不出错的时候就非常有用了,一定有办法在预编译的时候把这个宏函数的值计算出来吧 。继续求教育
看来我得提问有误导啊 ,不是像知道应该怎么用宏,是想知道怎么实现这个功能,用这个宏是不行的我自己也试过了只是给个抛砖引玉的提示而已。。。 展开
我想用宏定义 #define aa(a) a[a-1]+1
const a[3]={0,aa[1],aa[22]};但不行哎,求高手指教。
分不是问题主要是求教育啊
坐等高手 手把手教育啊3楼教育得是 那我从新写下吧
#define aa(a) a[a-1]+1
const a[3]={0,aa(1),aa(2)};
意义就在于当这个宏运算很复杂的时候,数组又很长的时候 以至于我手动去求值根本不可能不出错的时候就非常有用了,一定有办法在预编译的时候把这个宏函数的值计算出来吧 。继续求教育
看来我得提问有误导啊 ,不是像知道应该怎么用宏,是想知道怎么实现这个功能,用这个宏是不行的我自己也试过了只是给个抛砖引玉的提示而已。。。 展开
6个回答
展开全部
把你的程序优化了一下,注意,C语言里面是不能有标识符重名的哦,你的这句 #define aa(a) a[a-1]+1,里面参数a与数组名a重复了
实际上const修饰的变量不是真正的常量,用指针是可以修改他的值的
#include<stdio.h>
#define aa(n) a[n-1]+1
#define N 3 //加入宏定义,好的习惯
const int a[N];
int *p=a;//定义一个指针变量指向数组
main()
{
int i;
*p++=1;//对数组的第一个值进行赋值
for(i=1;i<N;i++)
{
*p++=aa(i);//宏调用赋值
}
for(i=0;i<N;i++)
printf("%d\n",a[i]);//打印输出
}
如果你觉得对你有帮助,请记得采纳为最佳答案哦。
如果还有什么不懂,百度hi我
实际上const修饰的变量不是真正的常量,用指针是可以修改他的值的
#include<stdio.h>
#define aa(n) a[n-1]+1
#define N 3 //加入宏定义,好的习惯
const int a[N];
int *p=a;//定义一个指针变量指向数组
main()
{
int i;
*p++=1;//对数组的第一个值进行赋值
for(i=1;i<N;i++)
{
*p++=aa(i);//宏调用赋值
}
for(i=0;i<N;i++)
printf("%d\n",a[i]);//打印输出
}
如果你觉得对你有帮助,请记得采纳为最佳答案哦。
如果还有什么不懂,百度hi我
更多追问追答
追问
代码风格很好,很有帮助,可是还是木有解决问题啊 就是在初始化的时候就把值求出来,而不是每次调用都去计算一次,因为他的值是递归的到后面计算起来会很耗时
追答
预编译是不会进行运算操作的,预编译最多进行宏展开,而给数组赋初值是不能有运算操作的,你想用递归,空间复杂度降低了,时间复杂度必然上升啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的语法学的乱七八糟, “const型数组”到底是个什么怪物
就这个事情而言不知道你到底想要个什么结果, 总之我不觉得你这个思路有什么意义
如果你就是想要一系列的常量定义成比方说 a[1]就是1, a[2]就是2, 这样的, 最简单就是直接写1,2.。。。。还剩了a和括号。 如果你为了某些目的非要给1,2什么的一个名字可以用宏
#define a(n) n
这样你写a(1)就是1,如果你就是看圆括号不顺眼,非要用方括号,那我也帮不了你了
关于你的这个说法“意义就在于当这个宏运算很复杂的时候,数组又很长的时候” 如果一个常量数组是由宏来的, 那么这个数组根本就没有存在的必要,单用宏就足够了
就这个事情而言不知道你到底想要个什么结果, 总之我不觉得你这个思路有什么意义
如果你就是想要一系列的常量定义成比方说 a[1]就是1, a[2]就是2, 这样的, 最简单就是直接写1,2.。。。。还剩了a和括号。 如果你为了某些目的非要给1,2什么的一个名字可以用宏
#define a(n) n
这样你写a(1)就是1,如果你就是看圆括号不顺眼,非要用方括号,那我也帮不了你了
关于你的这个说法“意义就在于当这个宏运算很复杂的时候,数组又很长的时候” 如果一个常量数组是由宏来的, 那么这个数组根本就没有存在的必要,单用宏就足够了
更多追问追答
追问
可是他的成员的值再编译时候就能算出来的,如果只是用宏代替的话当然也可行,可是每次运行的时候都要从计算一次,严重浪费cpu时间
追答
如果宏里面不涉及变量就会在编译时候算出来
如果宏里面涉及变量你就不能用这个宏来初始化常量
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
const是限定常数符
cosnt 常量在被定义时就必须付给一个常数值 ,再以后的使用中不可更改
递归的方法是行不同的
建议你搜索一下 const关键词的用法
cosnt 常量在被定义时就必须付给一个常数值 ,再以后的使用中不可更改
递归的方法是行不同的
建议你搜索一下 const关键词的用法
更多追问追答
追问
是的 但是这个数组的每个成员其实都是可以在预编译的时候编译成常量的,因为a[0]是有初值的。该怎么做呢?
追答
因为define不是常量啊
所以对const初始化是不对的 而且默认来说 #define宏是没有数据类型的 而在定义const要求使用数据类型作为限定
给你个示例:
#include
#define aaa 666
int main()
{
#define aaa 777
printf("%d",aaa);
return 0;
}
输出结果是 777 所以aaa是变量值 不可以初始化const
参考资料: re
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我不是很懂,但是我想问个问题哎
const a[3]={0,aa[1],aa[22]};
我怎么觉得 应该是
const a[3]={0,aa[1],aa[2]};
我好像觉得你多出来一个2,求教。
新手,刚学C#
宏 老师没讲过,求教。。
const a[3]={0,aa[1],aa[22]};
我怎么觉得 应该是
const a[3]={0,aa[1],aa[2]};
我好像觉得你多出来一个2,求教。
新手,刚学C#
宏 老师没讲过,求教。。
追问
是的 一时打快了,2了一下就多打了个2。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>
int fun(int n)
{
if(n==0)
return 0;
else
return fun(n-1)+1;
}
void main( )
{
int a[10],i;
for(i=0;i<10;i++)
a[i]=fun(i);
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
int fun(int n)
{
if(n==0)
return 0;
else
return fun(n-1)+1;
}
void main( )
{
int a[10],i;
for(i=0;i<10;i++)
a[i]=fun(i);
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
更多追问追答
追问
因为数组的值其实一开始就是确定的,要在初始化的时候确定啊
追答
递归函数不是在预编译阶段时执行。我认为:用递归满足不了你的要求。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询