gpt4 book ai didi

c - 在数组访问/下标中反转操作数的原因

转载 作者:太空狗 更新时间:2023-10-29 17:03:07 26 4
gpt4 key购买 nike

在 C 中,可以反转数组下标的操作数并仍然获得相同的结果。例如 a[b] == b[a]。这是因为(根据 C11 draft N1570, §6.5.2.1/2 )a[b](*((a)+(b))) 相同,而 + 是可交换的。有关更多信息,请参阅 this question .

是否存在这样一种情况(在 C 语言中,没有运算符重载)交换 [] 运算符的操作数 不会 在处产生相同的值运行?那么,是否存在 ab 满足 a[b] != b[a]? (假设程序编译并且 a[b] == a[b])

最佳答案

您重申为什么 a[b]b[a] 含义相同,这似乎基本上已经回答了您自己的问题。该解释是正确的,并且直接基于标准。主要警告是 ab 必须具有类型和值,以便评估 a[b] 具有定义的行为。只要是这种情况,两个表达式的计算结果就必须相同。否则,对于两个表达式的计算结果是否相同,C 无话可说。

稍微不同的是,如果允许 ab 表示比变量名和常量更复杂的表达式,那么它是可以选择它们,使得评估 overall 条件表达式 (a)[b] == (b)[a] 具有未定义的行为,即使评估左侧和右侧的子表达式分别具有定义的行为。例如,

char array[2] = "a";
int index = 0;
// undefined:
_Bool condition = array[index++] == (index++)[array];

但是,总的来说,无论类型、形式或ab 的值。

关于c - 在数组访问/下标中反转操作数的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42319737/

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