【问题标题】:Can anyone explain why the x is displaying value 1 instead 2谁能解释为什么 x 显示值 1 而不是 2
【发布时间】:2015-02-26 12:27:02
【问题描述】:

我正在努力提高我的编程技能。下面程序的输出是 'I'm in else if 1'。 我想知道背后的原因,为什么x值没有初始化为2而是显示为1。

#include <iostream>
using namespace std;

int main()
{
   if (false)
   {
      cout << "I'm in if " << endl;
   }
   else if (int x=2 && true)
   {
      cout << "I'm in else if " << x << endl;
   }
   else
   {
      int y = x;
      cout << y << endl;
   }

   return 0;
}

【问题讨论】:

  • 运算符的优先级...
  • @iharob:Yes it does。在if 标头中声明的变量在ifelse 块中都作用域。
  • @iharob 实际上它确实编译
  • @MikeSeymour 我不知道,我不喜欢它......
  • 关于其他答案,如果是优先级问题,可以用括号解决,但if((int x = 2) &amp;&amp; true)(或其他)是语法错误。如果= 是这里的运算符,if(int x = 2 , 1) 会起作用(逗号的优先级低于赋值),但这也是语法错误。

标签: c++ operator-precedence


【解决方案1】:

根据运算符优先级,

if (int x=2 && true)

被解析为

if (int x = (2 && true))

所以x = true 所以1

【讨论】:

  • 被视为? +1,但我认为您可以更好地解释。
  • @MukitChowdhury 不,它是 &&。 2 && 真为真,真为 1
  • @MukitChowdhury 编号2 &amp; true2 &amp; 1 相同,即02 &amp;&amp; truetrue &amp;&amp; true 相同,即true(转换为int 时为1)。
  • @MukitChowdhury: 不,2 &amp;&amp; truetrue2 &amp; true0
  • 那么这里的 2 被读取为布尔值 'true',并且 (true && true) 等于 'true'。并且在 x 中,分配了一个非零值而不是“真”。这样可以吗?
【解决方案2】:

简介

这归结为编写选择语句时所涉及的语法,这就是if 的真正含义。

通过阅读标准的相关部分,我们发现以下内容:

6.4p1 选择声明 [stmt.select]

选择语句选择几个控制流之一

selection-statement:
  if ( condition ) statement
  if ( condition ) statement else statement
  switch ( condition ) statement

condition:
  expression
  [...] decl-specifier-seq declarator = initializer-clause
  [...] decl-specifier-seq declarator braced-init-list

这是什么意思?

当编译器看到 if (int x=2 &amp;&amp; true) 时,它会将 2 &amp;&amp; true 解析为声明引入的名称 (int x =) 的 initializer


理论 sn-p
从语义上讲,您的 sn-p 等同于以下内容 - 这无疑解释了为什么 x 等于 1

 if (false) {
    cout << "I'm in if " << endl;
 } else {
   int x = 2 && true;
   if (x) {
    cout << "I'm in else if " << x << endl;
   }
 }


2 &amp;&amp; true 转换为int

int x = (2 && true)    =>
int x = (true && true) =>
int x = true           =>
int x = 1

【讨论】:

    【解决方案3】:

    if 语句中的条件可以是表达式或声明某些内容,它们不能组合(表达式不能声明任何内容)。 int x = 2 &amp;&amp; true 声明x 并将其初始化为2 &amp;&amp; true,即true(或转换为int 时为1)。

    要按照预期执行,x 需要在 if 之外声明:

    int x;
    if((x = 2) && true) { ... }
    

    注意括号,逻辑与的优先级高于赋值。

    【讨论】:

    • +1 表示最接近真相。 2 &amp;&amp; true 是这里的表达式,用作 x 的 brace-or-equal-initializerinitializer-clause
    【解决方案4】:

    这部分代码:

    int x=2 && true
    

    按以下方式工作:

    • && (and) 的优先级高于 = (assignment)
    • 由于 &&,2 被转换为布尔值
    • 2 为真,所以 2 转换为布尔值时为真
    • 真 && 真为真
    • 因为我们将 true 赋给一个 int 变量,所以它被转换为 int
    • 当 int 为 1 时为真
    • 因此,x 被初始化为 1

    注意,& 是按位和 && 是布尔和

    【讨论】:

      猜你喜欢
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 2015-01-06
      • 2022-06-27
      • 2021-03-14
      • 2013-04-16
      相关资源
      最近更新 更多