我无法阅读一系列*
和&
运算符,以便了解方法中的两个代码谎言。这些行是:
int dummy = 1;
if (*(char*)&dummy) { //Do stuff
}
我最好能确定:
dummy
在堆栈上分配,其值设置为1
&dummy
返回dummy
使用的内存位置(即1
所在的位置)(char*)&dummy
将&dummy
强制转换为指向char的指针,而不是指向int的指针*(char*)&dummy
取消引用(char*)&dummy
,返回任何字符值为1
的字符这似乎是一种非常令人困惑的说法:
if (1){//Do stuuf }
我是否正确理解了这些线条?如果是这样,为什么会有人这样做(除了迷惑我)?
答案 0 :(得分:1)
代码肯定不是可移植的,但显然是为了检测系统的字节顺序:int(1)
的非零位取决于系统是大端还是小端。在一种情况下,表达式的结果假定为0
,在另一种情况下,假设它是非零的。不过,我认为这是不确定的行为。另外,理论上还有DS9k的endianess,它完全把字节搞砸了(尽管我认为没有任何系统可以实现它)。