谁能解释为什么 x 显示值 1 而不是 2

Can anyone explain why the x is displaying value 1 instead 2

我正在努力提高我的编程技能。下面程序的输出是 '我在 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;
}

根据运算符优先级,

if (int x=2 && true)

被解析为

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

所以 x = true 所以 1.

简介

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

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

6.4p1 Selection statements [stmt.select]

Selection statements choose one of several flows of control

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

这部分代码:

int x=2 && true

按以下方式工作:

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

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

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

为了达到预期效果,x 需要在 if:

之外声明
int x;
if((x = 2) && true) { ... }

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