注册 登录
编程论坛 C语言论坛

请问复合字面量定义的类似数组的初始化列表是什么

暴君Dentiny 发布于 2019-08-24 19:11, 3808 次点击
这个字面量算是了解了,在谭浩强c程序设计中根本没有这个知识点,在c primer中解释的也不详细,各位师兄有没有自己的看法,可以来评论下
我写的代码
程序代码:
#include<stdio.h>
#define cols 4
int main()
{
    int* pat1;
    pat1 = (int[2]){ 1,2 };
    printf("数组的首值%d\n数组2的值%d", *pat1, *(pat1++ ));
    return 0;
}

但是输出的结果有点不近人意了,本来理想的输出结果是1 2但是结果正好相反
10 回复
#2
TysonKoothra2019-08-24 19:53
你把这个printf("数组的首值%d\n数组2的值%d", *pat1, *(pat1++ ));
改成 printf("数组的首值%d\n数组2的值%d", *pat1, *(pat1+1 ));
试试程序在你的电脑上,能不能正确输出。
#3
TysonKoothra2019-08-24 20:05
复合字面量定义的类似数组的初始化列表是什么?

数组的初始化是这样的int a[2] = { 1, 2 };
初始化列表就是{ 1, 2 }。
前面加上复合字面量的类型int [2],就构成了复合字面量(int[2]){ 1,2 };
#4
暴君Dentiny2019-08-24 21:59
回复 3楼 TysonKoothra
那怎么用指针调用呢
#5
TysonKoothra2019-08-24 22:10
回复 4楼 暴君Dentiny
像下面这个例子,因为这个复合字面量是长度为3的数组。就像数组一样使用,就好。
程序代码:

int main(void)
{
    int sum(int *, int);
    int s = sum( (int [3]){1,2,3}, 3);
    printf("s = %d\n", s);
}

int sum(int *p, int n)
{
    int s=0;
    for (int i =0; i < n; i++)
    {
        s+=p[i];
    }
    return s;
}
#6
吹水佬2019-08-25 05:58
printf("数组的首值%d\n数组2的值%d", *pat1, *(pat1++ ));
这句可能有问题,有些编译器可能会输出1、2或者其他。
简化一下看看:
printf("%p\n%p\n", pat1, pat1++);
#7
H_M2019-08-25 19:01
回复 楼主 暴君Dentiny
我知道了,printf的规则问题,从右到左,回想一下i++和++i的问题
你改成
printf("数组的首值%d\n数组2的值%d", *pat1, *(pat1+1));



[此贴子已经被作者于2019-8-25 19:06编辑过]

#8
H_M2019-08-25 19:02
回复 6楼 吹水佬
大佬,看我上面发的帖子[]
#9
rjsp2019-08-25 20:16
以下是引用H_M在2019-8-25 19:01:31的发言:

printf的规则问题,从右到左


跟 printf 没有关系,任何函数都这样,
“从右到左的压栈顺序”也不是C/C++规定和保证的,
即便是“从右到左的压栈”,也与“参数值评估的顺序”无关。

打开 https://zh.
翻到最后,你可以看到
2) 若一个标量对象上的副效应与另一个使用同一标量对象之值的值计算相对无顺序,则行为未定义。
f(i, i++); // 未定义行为
#10
H_M2019-08-25 21:27
回复 9楼 rjsp
认真看了,学到了,我错了。
#11
hoodlum19802019-08-27 18:25
不说你的 printf 的事情。但就是这个写法:
int* pat1 = (int[2]){ 1,2 };
也堪称十分的罕见。。。。
1