if语句中的多个条件

时间:2016-06-24 07:06:44

标签: c

我有一行代码如下:

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 ;;的条件位置操作

5 个答案:

答案 0 :(得分:2)

&& 运算符的关联顺序是从左到右

因此,在检查list[i-1]>ivalue

之前,首先检查i>0

因此,当 i = 0 时,list[i-1]变为list[-1]越界,因此会出现分段错误

注意:永远不会检查i>0

答案 1 :(得分:1)

这是因为对于运算符&&,如果第一个条件被评估为false,则不评估第二个条件。

答案 2 :(得分:1)

因为当您使用&&链接多个表达式时,在这种情况下i>0list[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],这会给您错误!