我对C.非常陌生。如果有人能够帮助理解第13,14和16行中的代码不起作用,但是第17-20行可以使用,我将不胜感激。
使用第一个选项(第13,14和16行),我收到错误
error: initializer element is not constant
这是什么意思?此外,这是否意味着不能使用某种类型的变量来生成新变量?
谢谢。
// Define structure for a good
5 struct good {
6 char goodname;
7 double p; //starting proportion
8 int theta; //average utility
9 int sigma; //variance of error
10 };
11
12 // The goods H and L
13 struct good H = {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20};
14 struct good L = {.goodname = 'L', .p = 0.5, .theta = 75, .sigma = 20};
15
16 struct good goods[2] = {H, L}; // **Does not work**
// ** Works**
17 struct good goods[2] = {
18 {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20},
19 {.goodname = 'L', .p = 0.5, .theta = 75, .sigma = 20}
20 };
答案 0 :(得分:4)
第16行不起作用的原因与为什么这个更简单的例子不起作用相同:
const int a = 5;
int b = a; // Does not work: "initializer element is not constant"
这意味着您只需要在初始值设定项中使用编译时常量表达式。 C不考虑变量编译时常量,即使是const
常量(另一方面,C ++认为const
变量编译时常量。)
答案 1 :(得分:2)
这意味着在C中,您只能使用常量表达式来初始化具有静态存储持续时间的数组或结构。
在您的示例中,所有对象都具有静态存储持续时间,但是:
struct good H = {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20};
上面的初始化器是文字,文字是C中的常量表达式,所以没关系。
struct good goods[2] = {H, L};
但是H
和L
对象不是常量表达式,因此编译器会给出错误。
C对常量表达式有一个相当严格的定义,并且对象的值不被视为常量表达式(即使对象是const
限定的或用文字初始化的。)
答案 2 :(得分:2)
变量的值,即使变量已经全局初始化 1 (即使它是const
- 限定的),也不是一个常量表达式。
指向静态持续时间变量 2 的指针是一个“扩展常量表达式”,可以用来初始化指针变量,所以你可以这样做:
struct good *goods[2] = {&H, &L};
例如,如果这适合问题。
1 是的,我知道“全局初始化”并没有真正明确定义。 :-)我的意思是,如果它是一个已经初始化的静态持续时间变量,并且在新的初始化程序点可见。
2 即,任何“全局”(文件范围)变量或块内的static
变量。
答案 3 :(得分:2)
H和L是包含数据的存储位置。声明:
struct good goods[2] = {H, L}; // **Does not work**
表示货物应指向H和L,或包含与H和L相同的值。
将数据从H和L复制到商品[0]和[1],或将商品修改为指针数组,如下:
struct good *goods[2];
goods[0] = &H;
goods[1] = &L;
答案 4 :(得分:2)
如果对象是静态的“goods [0] / goods [1]”,则只能用常量初始化。所以,你没有得到初始化“好H”的错误的原因。
如果将变量定义为非静态变量(对于e..g,在main()或任何函数()中),则不会出现此错误,因为该对象将被视为“auto” ”