假设 k 是一个指向 C 中整数的指针。
对于表达式**k,当我们尝试在赋值运算符(“=”)的右侧对其求值时,该值会是非法的吗?
这是我的想法:
**k 实际上是 *(*k)。当我们取消引用 k 时,我们得到一个整数的值。然后我们尝试取消引用一个整数,这是一个非法操作。
但是我的教科书说右边的这个表达式实际上是合法的。
为什么会这样?
最佳答案
C 2018 标准在第 6.5.3.2 条第 2 段中规定,“一元 *
运算符的操作数应具有指针类型。”如果k
是一个指向整数的指针,那么*k
是一个整数,它不是指针类型,所以它不能是一元*的操作数
运算符。因此,诸如 x = **k
之类的表达式违反了此规则。
ins 6.5.3.2 2 中的规则是一个约束,这意味着需要符合标准的编译器才能生成诊断消息,而 C 标准并未定义该行为。
从技术上讲,C 编译器除了发出诊断消息之外,还可以接受表达式并根据需要进行定义。我不知道有任何这样做,并且没有通用编译器这样做。
字符 **k
可能会出现在一些较大的表达式中,但它们并不同时充当一元 *
运算符,例如在 x = 中y**k
,相当于x = y * *k
,其中第一个*
是二进制乘法运算符。您应该显示教科书中显示的准确文本。
关于c - C 中棘手的指针算术 : **k,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54777726/