通过初始值设定项设置structs元素数组的语法?
我有以下C代码:通过初始值设定项设置structs元素数组的语法?,c,arrays,gcc,struct,c99,C,Arrays,Gcc,Struct,C99,我有以下C代码: typedef struct { int x,y; } Point2D; Point2D data[5]; 稍后在我的代码中(即不是在初始化数据期间),我想从x/y值设置数据的各个元素。双语句代码很简单: Point2D pt = {.x = a, .y = b}; data[3] = pt; 但是在C语言中有没有一种方法可以在一个语句中实现这一点呢?以下两种想法似乎都不是有效的C99代码(对于GCC 4.8.2): 使用复合文字: data[3] = ( Poi
typedef struct {
int x,y;
} Point2D;
Point2D data[5];
稍后在我的代码中(即不是在初始化数据期间),我想从x/y值设置数据的各个元素。双语句代码很简单:
Point2D pt = {.x = a, .y = b};
data[3] = pt;
但是在C语言中有没有一种方法可以在一个语句中实现这一点呢?以下两种想法似乎都不是有效的C99代码(对于GCC 4.8.2):
使用复合文字:
data[3] = ( Point2D ){.x = a, .y = b};
使用复合文字:
data[3] = ( Point2D ){.x = a, .y = b};
为什么您需要在一个单独的语句中执行此操作?你有什么理由吗?您可以使用复合文字来实现这一点,但代码不会更快,而且(可以说)只会变得更难阅读。@Lundin:因为IMHO不必要的临时变量会使代码变得混乱,使代码更不清晰。通常认为,将长行划分为多个语句可以使代码更清晰。通常认为,编写同时执行多项任务的长代码行很难阅读。当然,这是非常主观的。就我个人而言,复合文字比你原先所读的要少得多。是的,它是很主观的。在我的例子中,即使是复合文字也没有那么长(仍然远小于80个字符),而且复合文字具有更简洁的人类可读语义“将数组元素设置为新值”,而我的初始代码具有语义“构造一个新的临时结构,然后将数组元素设置为其值”。在后一种情况下,代码新手会记住临时变量,并确保其值不会在其他地方使用,以便完全理解代码。对于复合文字来说,这是不必要的。您正在制作临时变量的硬拷贝,因此之后对它发生的任何事情都无关紧要。如果存在意外重复使用变量的风险,则表明要么代码块太长,要么变量的作用域太宽。此外,如果您认为在使用复合文字时没有创建临时结构,那么您只是在愚弄自己。机器代码将与具有命名结构的原始代码相同。复合文字与任何其他局部变量具有相同的作用域和存储持续时间。为什么需要在单个语句中执行此操作?你有什么理由吗?您可以使用复合文字来实现这一点,但代码不会更快,而且(可以说)只会变得更难阅读。@Lundin:因为IMHO不必要的临时变量会使代码变得混乱,使代码更不清晰。通常认为,将长行划分为多个语句可以使代码更清晰。通常认为,编写同时执行多项任务的长代码行很难阅读。当然,这是非常主观的。就我个人而言,复合文字比你原先所读的要少得多。是的,它是很主观的。在我的例子中,即使是复合文字也没有那么长(仍然远小于80个字符),而且复合文字具有更简洁的人类可读语义“将数组元素设置为新值”,而我的初始代码具有语义“构造一个新的临时结构,然后将数组元素设置为其值”。在后一种情况下,代码新手会记住临时变量,并确保其值不会在其他地方使用,以便完全理解代码。对于复合文字来说,这是不必要的。您正在制作临时变量的硬拷贝,因此之后对它发生的任何事情都无关紧要。如果存在意外重复使用变量的风险,则表明要么代码块太长,要么变量的作用域太宽。此外,如果您认为在使用复合文字时没有创建临时结构,那么您只是在愚弄自己。机器代码将与具有命名结构的原始代码相同。复合文字与任何其他局部变量具有相同的作用域和存储持续时间。