【问题标题】:Compute expression计算表达式
【发布时间】:2014-06-17 12:04:22
【问题描述】:

我有:

#include <iostream>
int main()
{
    static int i, arr[10];
    cout<<(i==0) && (arr[i]<0);
} 

这意味着it 的所有元素都自动使用0 初始化。为什么这个表达式(i==0) &amp;&amp; (t[i]&lt;0) 返回真?即使这样也返回 true:

#include <iostream>
int main()
{
    static int i;
    cout<<(i==0) && (i==1);
}

当我把这个应该有正确答案a的问题加红时,我感到困惑:

  1. 鉴于声明:

静态整数 i, t[10];

并假设 i 和 t 均未显式初始化,则表达式的值 (i==0) &amp;&amp; (t[i]&lt;0)

(a) 是 1

(b) 为 0

(c) 取决于上下文

【问题讨论】:

  • 发布一个显示“问题”的代码示例。
  • Even this returns true: - 使用括号!
  • 试试cout&lt;&lt; (i==0 &amp;&amp; i==1);
  • 我编辑了这个问题,以便您了解我为什么没有使用cout&lt;&lt; (i==0 &amp;&amp; i==1);

标签: c++ expression


【解决方案1】:

您的问题在于运算符优先级。 &amp;&amp; 运算符在 &lt;&lt; 之后计算。因此,您的打印表达式变为:(cout&lt;&lt;(i==0)) &amp;&amp; (i==1);。更正优先级并按预期打印 0:cout&lt;&lt;((i==0) &amp;&amp; (i==1));

【讨论】:

  • 如果有疑问:更多括号!
  • 感谢您的澄清。我知道我应该用括号括起来整个表达式以确保。我编辑了问题以解释我为什么尝试这种方式。
  • C++ 标准要求both file-scoped and local static variables are zero-initialized。如果他们如你所说的那样给出了(a)的答案,那他们就错了。
  • 这就是我的想法,但尝试cout&lt;&lt;(i==0) &amp;&amp; (i==1); 让我感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2011-09-05
  • 2017-06-19
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多