gpt4 book ai didi

c - 有副作用的初始化器

转载 作者:太空狗 更新时间:2023-10-29 15:28:08 25 4
gpt4 key购买 nike

C18 标准在 6.7.9/2 中声明:

No initializer shall attempt to provide a value for an object not contained within the entity being initialized.

具体是什么意思不是很清楚。有相关话题:Incosistent gcc diagnostic for string initialization .我引用的子句用于解释以下初始化产生的错误:

//error: excess elements in array initializer char a[5]
char a[5] = {'h','e','l','l','o','\0'};

initializer-list 的长度超过了正在初始化的数组的大小。

但请考虑 more trivial example :

int main(void){
int a;
int b = (a = 3);
}

这里的初始化器是(a = 3),它是一个赋值表达式。并且初始化程序将一个值分配给另一个应该导致约束违反的对象。

为什么没有打印任何诊断信息?

最佳答案

那不是“为 a 提供一个值”。这是一个具有在 a 中存储值的副作用的表达式。 “提供一个值”应该在初始化的上下文中理解;它不是用于作业的措辞。

标准中的语言试图达到的目的的一个不太平凡的例子可能是:

struct {
char a[4];
char b[4];
} foo = { { 'h', 'e', 'l', 'l', 'o' } };

鉴于(我认为;如果我错了请纠正我)以下内容是有效的,尽管令人困惑,C:

struct {
char a[4];
char b[4];
} foo = { 'h', 'e', 'l', 'l', 'o' };

关于c - 有副作用的初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57451995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com