【问题标题】:Difference between redefinition of array elements in CC中数组元素重新定义的区别
【发布时间】:2022-01-19 23:14:54
【问题描述】:

我是 C 的初学者,在编程过程中我发现了有关按位加法的代码

#define WORD_FROM_BUF(WRD) ((((unsigned char *)(WRD))[0]<<8)|((unsigned char *)(WRD))[1])

我已经尝试将这段代码修改为这种形式

 #define WORD_FROM_BUF(WRD) (((unsigned char *)(WRD[0])<<8)|((unsigned char *)(WRD[1]))

编辑 我的问题类似于这两个问题 C macros and use of arguments in parentheses- by Palec

Can we remove parentheses around arguments in C macros definitions?- by Palec

谢谢大家的解释

【问题讨论】:

  • 两个字:运算符优先级。
  • 这能回答你的问题吗? C macros and use of arguments in parentheses
  • 呃。 IMO 那是非常糟糕的代码。 Waaaay 太多的东西被塞进了那个宏——这就是为什么你很难弄清楚发生了什么。被一个在优化过程中内联的函数所取代真是令人尖叫......
  • 您修改原始代码的目的是什么?源代码中符号的随机重新排列通常会导致不同的结果(通常是编译错误,但有时会以不同的方式运行有效程序)。
  • 除了第二个例子有不平衡的括号外,第一个例子中的转换修改了WRD(在索引结果之前),但在第二个例子中它们修改了WRD[0]WRD[1](在索引结果之后)指针)。索引[1] 的实际偏移量(以字节为单位)取决于指针的类型。

标签: c redefinition


【解决方案1】:

(unsigned char *)(WRD) 获取指针(?)WRD 并将其转换为指向字节的指针。使用[0] 索引该字节指针会从缓冲区中获取第一个字节。将其与下一个字节组合时,您会得到一个两字节的值。

(unsigned char *)(WRD[0]) 从缓冲区中取出第一个字(?)并将 那个字变成一个指针。完全不同,而且很可能完全错误,因为移动指针 &lt;&lt; 8 毫无意义。

然后WRD[1] 从缓冲区中取出第二个字,而不是第二个字节。

【讨论】:

  • 您的回答说明了一切。谢谢你的解释
猜你喜欢
  • 2018-04-04
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
相关资源
最近更新 更多