谁能解释为什么 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) { ... }
注意括号,逻辑与的优先级高于赋值。
我正在努力提高我的编程技能。下面程序的输出是 '我在 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) { ... }
注意括号,逻辑与的优先级高于赋值。