Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过初始值设定项设置structs元素数组的语法?_C_Arrays_Gcc_Struct_C99 - Fatal编程技术网

通过初始值设定项设置structs元素数组的语法?

通过初始值设定项设置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

我有以下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] = ( Point2D ){.x = a, .y = b};

使用复合文字:

data[3] = ( Point2D ){.x = a, .y = b};

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