- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑:
union { int i; char c; } x = {0};
x.c = x.i;
C 2018 6.15.16.1 3,关于简单赋值,说:
If the value being stored in an object is read from another object that overlaps in any way the storage of the first object, then the overlap shall be exact and the two objects shall have qualified or unqualified versions of a compatible type; otherwise, the behavior is undefined.
x.c
和
x.i
重叠但不完全重叠并且没有兼容类型的版本。那么这个赋值的行为不是由 C 标准定义的吗?
最佳答案
在我看来,您发现了标准中的缺陷。我认为意图是x.c = x.i;
具有未定义的行为,但该段落(自 C90 以来一直在标准中)没有正确表达该意图。
该措辞适用于简单分配。在一个简单的赋值中,LHS 必须是一个左值,而 RHS 只是一个表达式。如果 RHS 恰好是一个左值,它会按照 6.3.2.1p2 中的描述进行左值转换。左值转换后就不再是左值了。
可以合理地说,当对象重叠时,将一个对象复制到另一个对象的赋值具有未定义的行为(除非重叠是精确的并且对象具有兼容的类型)。但是赋值不对两个对象进行操作;它对一个对象(LHS)和一个非左值表达式(RHS)进行操作。
该段落说该值“是从另一个对象读取的”。这是模棱两可的。对象的名称必须是整个 RHS 表达式,还是可以只是一个子表达式?如果是后者,则 x.c = x.i + 1;
会有未定义的行为,在我看来这是荒谬的。
正如所写,引用段落中给出的条件不可能发生。
如果要更正该段落,则应仅在 RHS 是左值时(在左值转换之前)才适用,并讨论 LHS 指定的对象与 RHS 指定的对象之间的重叠。
这里的特定情况,分配重叠的小整数对象,在实践中不太可能引起问题,但我们可以构建更成问题的情况。例如:
int main() {
struct big {
int array[1000];
};
struct big_wrapper {
int n;
struct big b;
};
union u {
struct big x;
struct big_wrapper y;
};
union u obj;
obj.x = obj.y.b;
}
这里的赋值将一个大对象的值复制到另一个大对象中,其中两个对象重叠但不在同一位置开始。为了正确实现这一点,编译器必须检测重叠并可能生成对
memmove()
的调用。或等效的。如果通过指针执行分配,则重叠可能不会直接可见。使行为未定义允许编译器为非重叠情况生成有效的代码。
关于c - 是否从 C 标准定义的同一 union 中的不同成员分配给 union 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65077630/
自从我的问题here无法自信地回答,我在这里再次询问,希望有人确切知道: 指向 union 的指针和包含指向其元素的指针的 union 之间有什么区别(除了语法之外)吗? this中生成的程序集示例是
在 C 语言中,是否可以在另一个 union 体中定义一个 union 体?如果不是,为什么不可能?或者如果可以,可以在哪里使用? 最佳答案 假设您要定义: union myun { int x;
在 C 中,是否可以在另一个 union 中定义一个 union ?如果不是,为什么不可能?或者如果是,它可以在哪里使用? 最佳答案 假设你想定义: union myun { int x; s
我正在阅读一些代码并发现如下内容: typedef union { int int32; int boolean; time_t date; char *string;
我正在学习Lua,我更愿意使用冒号(:)作为方法。不幸的是,它并非在所有地方都有效。看我的代码: 设置= {} 本地mt = {} 函数Set:new(m) 本地集= {} setmetatable(
我遇到了一些性能问题,我有如下查询: SELECT * FROM Foo UNION SELECT * FROM Boo UNION SELECT * FROM Koo 我确信 Koo 不会返回任何重
This question already has answers here: C++ Structure Initialization (16个答案) 上个月关闭。 我正在尝试将一些用于嵌入式目标的
UNION 和 UNION ALL 有什么区别? 最佳答案 UNION 删除重复记录(结果中的所有列都相同),UNION ALL 则不会。 使用 UNION 而不是 UNION ALL 时会影响性能,
我想在两个表上使用联合运算符。我希望结果集消除由联合创建的重复值,但不消除表中预先存在的重复值。考虑这段代码... select b from (values (1), (2), (2
我知道 UNION 会删除重复项,但即使没有重复项也会更改结果顺序。 我有两个 select 语句,任何地方都没有 order by 语句 我想将它们合并或不合并(全部) 即 SELECT A UNI
基本上,我有一个 struct foo { /* variable denoting active member of union */ enum whichmembe
我有一个大规模查询,用于对许多表(每个表有数千行)执行 UNION ALL,然后在返回之前输出到临时表。 旧形式: SELECT * FROM (SELECT `a` AS `Human rea
UNION 和 UNION ALL 有什么区别? 最佳答案 UNION 删除重复记录(结果中的所有列都相同),UNION ALL 则不会。 使用 UNION 而不是 UNION ALL 时会影响性能,
如果我有两个 union 行结构: struct A { A() {} ~A() {} union { vector vi; vector db
考虑下面的代码,我已经写了: #include #include union myAccess { uint16_t access16; struct { uint
我想弄清楚你从 C99 中对齐变量的地役权中得到了什么: Exception to strict aliasing rule in C from 6.5.2.3 Structure and union
我正在通过 UNION 或 UNION ALL 从多个表中选择一列外键。 当重复无关紧要时,通常建议使用 UNION ALL 而不是 UNION 来解决性能问题。但是,在我的调用 PHP 脚本中,循环
在 C++ 中,union 可以包含静态成员,在类的情况下,这些成员属于一个类,因此对所有对象都是通用的。 union U { long l; int i; static long
任何人都可以提及普通和匿名 union (或结构)之间的区别吗?我刚找到一个: 不能在匿名 union 中定义函数。 最佳答案 您不需要点运算符“.”访问匿名 union 元素。 #include
我可能把这个复杂化了.. 我正在尝试在 Arduino 上用 C 语言为嵌入式应用程序制作一个相当可重用的分层菜单系统。我有结构来表示不同类型的菜单项,包括那些子菜单,以及这些菜单项的 union 是
我是一名优秀的程序员,十分优秀!