我有一行代码如下:
for (ivalue=list[i];i>0 && list[i-1]>ivalue;i--)
...
运行正常。但是,如果我改变第一个条件的位置i> 0,它将以分段故障退出:运行时为11:
for (ivalue=list[i];list[i-1]>ivalue && i>0;i--)
exits with Segmentation fault: 11
为什么结果取决于&&amp ;;的条件位置操作
答案 0 :(得分:2)
&& 运算符的关联顺序是从左到右
因此,在检查list[i-1]>ivalue
i>0
因此,当 i = 0 时,list[i-1]
变为list[-1]
越界,因此会出现分段错误
注意:永远不会检查i>0
答案 1 :(得分:1)
这是因为对于运算符&&
,如果第一个条件被评估为false,则不评估第二个条件。
答案 2 :(得分:1)
因为当您使用&&
链接多个表达式时,在这种情况下i>0
和list[i-1]>ivalue
,只有前一个表达式在计算结果为false时才会执行。
如果i
小于1,您的第二个表达式将访问无效索引。
答案 3 :(得分:1)
在你的情况下list[i-1]
指向无效的内存(你的程序不允许访问的内存),如果条件中的&&
语句的第一部分被评估为false,则第二部分永远不会执行(这称为短路评估)。这就是第一个示例正常工作(在某些情况下)的原因,而实际访问list[i-1]
的第二个示例会出现分段错误。
Wikipedia也有一篇关于短路评估的好文章。
答案 4 :(得分:1)
我可以假设list[i-1]
超出数组范围。
当您使用&&
时,代码会检查您的第一个条件,如果它是 true ,则检查第二个条件,因此在第一种情况下,list[i-1]
仅限于访问{{1因为您首先检查list[0]
,而在第二种情况下,您在i>0
检查之前检查list[-1]
,这会给您错误!