我在互联网上看到了一个代码并且可以打印出有意义的字符串,但是没有理解它是如何工作的,任何人都可以解释这些逻辑吗?谢谢!
#include <stdio.h>
double x = 6.55538260547163850123456789E-260, y;
int main(){return(*(char*)&x?x*=y=x,main():printf((char*)&y));}
更新
我已将代码清理成
#include <stdio.h>
double x = 6.55538260547163850123456789E-260, y;
int main(){
if (*(char*)&x) {
y = x;
x *= y;
main();
} else {
printf((char*)&y);
}
}
但仍然不知道(char*)&y
如何成为一个有意义的字符串,我认为这是关于双精度或地址演员,所以这就是标题
更新II:
我认为核心代码是:
#include <stdio.h>
double x = 6.55538260547163850123456789E-260, y;
int main(){
y = x;
printf((char*)&y);
}
但地址演员仍然很奇怪。
答案 0 :(得分:1)
它将double值的字节重新解释为字符串。这将查看字节:
#include <stdio.h>
double x = 6.55538260547163850123456789E-260;
int main(){
unsigned char *y = (unsigned char *)&x;
for (int i = 0; i < sizeof(double); i ++) {
printf("%02hhx %c\n", y[i], y[i]);
}
}
在我的电脑上吐出
61 a
73 s
6f o
75 u
6c l
20
20
0a
但是这里存在一个问题 - 字符串是"asoul \n"
- 但是没有终止\0
- 所以实际上你的代码有未定义的行为,即使在我的笔记本电脑上我有意义消息。