【问题标题】:Does && in c++ behave the same as && in Java?c++ 中的 && 行为是否与 Java 中的 && 相同?
【发布时间】:2011-04-21 10:00:59
【问题描述】:

我的问题基本上就在标题中。基本上我已经了解到,在 Java 中 && 运算符的作用类似于短路,因此如果第一个条件的计算结果为 false,它不会查看语句的其余部分。我假设在 c++ 中就是这种情况,但我正在编写一些代码,它首先检查索引是否超过列表大小,然后将列表中的索引与另一个数字进行比较。比如:

//let's say list.size()=4;

for(int i=0; i<10; i++)
{
   if(i < list.size() && list.get(i) == 5)
       //do something
   ...
}

这不是确切的代码,但它说明了这一点。我假设由于 i > 列表大小,后半部分不会被评估。但它似乎仍然存在,我相信这会导致 Seg Fault。我知道我可以使用嵌套的 if,但这太碍眼而且浪费空间。有什么帮助吗?

【问题讨论】:

  • 我不确定这对于 Java 或 C++ 是否完全正确。根据我的经验,单个 if 条件中的所有条件都会被评估。
  • 感谢大家的回答。我不知道还有什么问题。我要继续用头撞桌子……
  • @Brian:我不得不假设你没有任何 Java 或 C++ 经验。
  • @Brian:作为提醒,这在 C# 中也适用:-P。
  • @Brian:好吧,我只能说,作为一个单独的问题发布了该行为的可运行示例,因为它似乎与&amp;&amp;:msdn.microsoft.com/en-us/library/2a723cdk(VS.71).aspx 的文档相悖。我没有方便的 C# 环境,但我猜你在歪曲一些东西。你确定你没有尝试||

标签: java c++ logical-operators


【解决方案1】:

快捷方式在 C、C++ 和 Java 中的工作方式相同。

但是,根据示例代码,如果 listnull,您可能会遇到段错误。 C++ 没有等效于 Java 的 NullPointerException。如果 list 可能为空,您也需要对其进行测试。

更新 后半部分仅适用于 list 是指针的情况。 (这似乎不是。)如果是这样的话,它看起来像:

if (list && i < list->size() && list->get(i) == 5)

【讨论】:

  • 我不知道您可以通过这种方式测试是否为空。感谢您的信息。
  • @user391369:你不能用 Java,但可以用 C++。在 Java 中,您需要将其设为布尔表达式 (if (list != null &amp;&amp; ...)。
  • 根据list.size()的用法,在这种情况下list似乎不是一个指针,因此对null的测试将不起作用。
  • @GBegen 很好。不敢相信我错过了。我知道我几个月来一直在 Java 小伙子里扎根,但是......哇。走吧。
【解决方案2】:

&& 和 ||如果没有过载,操作符会短路。但是,我相信它们可能会被重载,在这种情况下,如果在重载生效的类型上使用它们不会短路。

【讨论】:

    【解决方案3】:

    是的 &amp;&amp; 在 Java 中的行为与在 C++ 中的行为相似。它是一个短路运算符,也是一个序列点 [在 C++ 中]。操作数的计算顺序定义明确,即从左到右。

    【讨论】:

      【解决方案4】:

      是的,在 C 和 C++ 中 && 和 ||运营商短路。

      【讨论】:

        【解决方案5】:

        C++ 短路 && 和 ||就像Java一样。在 if(i &lt; list.size() &amp;&amp; list.get(i)) 中,如果 i &lt; list.size() 为 false,则不会评估 list.get(i)

        【讨论】:

          【解决方案6】:

          C++ && 和 ||运营商也做短路。小心,也许你放了一个 & 并且 C++ 使用的是二进制和运算符,这不是短路的。如果您需要更多帮助,请发布更多相关代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-07
            • 1970-01-01
            相关资源
            最近更新 更多