【问题标题】:Why is this snippet compilable in C? [duplicate]为什么这个片段可以在 C 中编译? [复制]
【发布时间】:2010-11-30 00:48:24
【问题描述】:

可能重复:
In C arrays why is this true? a[5] == 5[a]

3["zdvnngfgnfg"];

【问题讨论】:

标签: c++ c arrays declaration


【解决方案1】:

相当于

"zdvnngfgnfg"[3];

这是合法的,意思是“获取该文字的地址并将3*sizeof(char) 添加到它”。反正不会有效果。

另请参阅this 非常相似的问题。

【讨论】:

  • 意思不也包括“然后取那个地址的值”吗?
  • 我想不是,因为语句既不在赋值的左侧也不在右侧。
  • 由于 sn-p 是一个完整的表达式,它实际上的意思是“然后取值”。但是因为这样做没有定义的副作用,并且结果被丢弃,所以允许编译器省略它。事实上,编译器也可能会忽略指针添加——它所做的只是确保语句是合法的,意识到它什么都不做,然后忽略它。当然这就是 gcc 所做的,即使没有优化。
  • 在 C 中,作为表达式语句出现的表达式被转换为右值:访问其中的值。 "除了 sizeof 运算符、一元 & 运算符、++ 运算符、-- 运算符的操作数或 . 运算符或赋值运算符的左操作数时,将转换不具有数组类型的左值到存储在指定对象中的值”。该行为与 C++ 不同,在 C++ 中,如果未请求读取,则不会获取任何值。但可以肯定的是,您不会注意到其中的差异,因为数组不是 volatile :)
  • 对常量字符串进行索引可以在用于转换为十六进制数字时生成特别漂亮的代码:char digit = "0123456789ABCDEF"[i];
【解决方案2】:

arr[i] 被解析为 *(arr+i) 可以写成 *(i+arr) 因此 i[arr]
现在“strngjwdgd”是一个指向存储在只读位置的常量字符数组的指针。
所以它有效!

【讨论】:

    【解决方案3】:

    字符串文字 (array) 衰减为 char* 类型的指针。然后你取第四个元素:

    3["zdvnngfgnfg"] == "zdvnngfgnfg"[3]
    

    为什么可以在数组前面写下标是另一个问题:

    In C arrays why is this true?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多