任何人都可以解释为什么x显示值1而不是2

时间:2015-02-26 12:27:02

标签: c++ operator-precedence

我正在努力提高我的编程技巧。程序的输出如下 '我在其他地方,如果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;
}

4 个答案:

答案 0 :(得分:8)

根据运营商优先顺序,

if (int x=2 && true)

被解析为

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

所以x = true所以1

答案 1 :(得分:4)

简介

这归结为编写选择陈述时所涉及的语法,这正是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 && true)时,它会将2 && true解析为声明(int x =)引入的名称的初始化程序


理论摘要
从语义上讲,您的代码段与以下内容相同 - 这无疑解释了为什么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 && true转换为int

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

答案 2 :(得分:1)

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

要做似乎有意的事情,x需要在if之外宣布:

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

注意parens,逻辑AND的优先级高于赋值。

答案 3 :(得分:0)

这部分代码:

int x=2 && true

以下列方式工作:

  • &安培;&安培; (和)优先于=(赋值)
  • 因为&amp;&amp;,2被转换为布尔值
  • 2是真的,所以当它转换为布尔值时,2为真。
  • true&amp;&amp;真实是真的
  • 因为我们将int赋值给int变量,所以它被转换为int
  • true,因为int是1
  • 结果
  • ,x由1
  • 初始化

注意,&amp;是按位和&amp;&amp;是布尔值和