有人可以向我解释为什么以下代码输出0 0
。我在数学上a-b == 0
⇒a == b
char* V1 = "hello, world!\n";
main(){
F1(V1);
}
F1(A1){
printf("%u %u\n", V1 - A1, V1 == A1);
}
答案 0 :(得分:2)
正如@SouravGhosh所指出的,这里存在未定义的行为。仍然有趣的是,理解为什么第二个打印值有时为0,有时为1(取决于它运行的机器)。
缺少F
输入的显式类型意味着A1
隐式为int
。函数调用F(V1)
因此将指针V1
强制转换为int
。在某些机器上,这可能是一个缩小的转换,这就是为什么在某些机器上比较V1 == A1
为真,而在其他机器上它是错误的。也许在某些机器上,V1 - A1
中的两个参数都被强制转换为整数(因此值为0),但在比较V1 == A1
(即ub)中尝试将A1
强制转换为有效地址,并且失败或将其转移到不同的地址。