Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 值相同但不相等_C_Pointers - Fatal编程技术网

C 值相同但不相等

C 值相同但不相等,c,pointers,C,Pointers,有人能给我解释一下为什么下面的代码输出0。我的印象是,从数学上讲,a-b==0⇒ a==b char* V1 = "hello, world!\n"; main(){ F1(V1); } F1(A1){ printf("%u %u\n", V1 - A1, V1 == A1); } 根据C11标准第§6.5.6章,两个指针只能从同一数组对象中减去任何一个 减去两个指针时,两个指针都应指向同一数组对象的元素, 或超过数组对象最后一个元素一次;结果是两个参数的差异 两个数组元素的下标。

有人能给我解释一下为什么下面的代码输出
0
。我的印象是,从数学上讲,
a-b==0
⇒ <代码>a==b

char* V1 = "hello, world!\n";

main(){
  F1(V1);
}

F1(A1){
  printf("%u %u\n", V1 - A1, V1 == A1);
}

根据
C11
标准第§6.5.6章,两个指针只能从同一数组对象中减去任何一个

减去两个指针时,两个指针都应指向同一数组对象的元素, 或超过数组对象最后一个元素一次;结果是两个参数的差异 两个数组元素的下标。结果的大小由实现定义, 其类型(有符号整数类型)是
标题中定义的
ptrdiff\u t
。 如果结果不能在该类型的对象中表示,则行为是未定义的。[……]

也就是说,您应该使用
%td
打印指针减法生成的类型为
ptrdiff_t
的结果


接下来,谈到
=
运算符的用法,它不能用来比较字符串(数组)的内容,它基本上比较指针本身(而不是指针指向的内容)。

正如@SouravGhosh所指出的,这里有未定义的行为。不过,理解为什么第二个打印值有时为0,有时为1(取决于它运行的机器)还是很有趣的


F
的输入缺少显式类型意味着
A1
隐式地是
int
。因此,函数调用
F(V1)
将指针
V1
投射到
int
。在某些机器上,这可能是一个缩小的转换,这就是为什么在某些机器上比较
V1==A1
为真,而在其他机器上比较为假。也许在某些机器上,
V1-A1
中的两个参数都转换为int(因此值为0),但在比较中,
V1==A1
(即ub)尝试将
A1
强制转换到有效地址,但失败或将其强制转换到其他地址。

不要告诉我你真的编写了该代码…..这是来自其他人错误代码的一个最小可行示例。。。他们声称它在Visual Studio中运行良好…
==
在C中对字符串进行比较并不意味着你认为它的意思。它(在你修复了所有明显的错误之后)。你上次的编辑只是增加了代码中的错误数量,这是一个相当大的成就!好吧,这两个值不相等的原因是因为它是未定义的行为?@user12341234主要是坏代码(无意冒犯),其次,
==
strcmp()
不同,第三,你是对的。你首先:无意冒犯,我没有写这个,只是简化了它。Re Secondary:我认为最初的目的不是比较字符串内容,而是比较指针。第三:谢谢。那些“指针”不是都指向同一个数组对象吗?我不确定这是否是未定义行为的具体来源,但如果值相同,并且有一个变窄,那么
==
的两个操作数不是都会向下倾斜并且仍然相等吗?好问题。将整数与指针进行比较是未定义的行为,因此比较是未定义的。在任何情况下,
V1==V1
*都是真的,
A1==V1
有时会计算为假,而从
指针
int
的隐式转换是唯一可能引入比较双方之间差异的地方。也许问题不是缩小范围本身,而是转换成有符号的数字。