在if语句的条件部分定义变量不允许对其值进行比较.为什么?

Defining a variable in the condition part of an if-statement does not allow comparison of its value. Why?

本文关键字:比较 为什么 不允许 语句 if 条件部 变量 定义      更新时间:2023-10-16

摘要

这个问题与:在if语句的条件部分定义变量有关?。

那么,为什么我不能在同一个地方检查新定义的变量的值呢?


简单示例

换句话说,这是允许的(来自链接的问题(:

if( int* x = new int( 20 ) ) 
{   
    std::cout << *x << "!n";
    delete x;
}   

但这不是:

if( NULL != ( int* x = new int( 20 ) ) )
{   
    std::cout << *x << "!n";
    delete x;
}   

第二个给了我:

test.cpp:xx: error: expected primary-expression before ‘int’
test.cpp:xx: error: expected ‘)’ before ‘int’

问题

还有(也许(这里更重要的问题——如何评估第一个if的条件?根据我的测试,这两个选项似乎都是一样的——有针对false(0NULL,不管怎样(的隐式检查。但它有标准保证吗?


真实世界示例

好吧,我不能将新变量与某些自定义值进行比较,但我可以将其与false进行比较。所以,这里有一个真实世界的例子:我有一个类,包含一个template方法:check_class。此方法对内部指针执行dynamic_cast。现在我想使用它像:

if( some_class* some_class_ptr = cmd->check_class< some_class >() )
{
     // some_class_ptr is NOT NULL here
}
else if( other_class* other_class_ptr = cmd->check_class< other_class > )
{
    // other_class_ptr is NOT NULL here
}
// ...

想要这样做的原因是if会很长,我不想在它之前声明所有变量。

那么,为什么我不能在同一个地方检查新定义的变量的值呢?

因为语法不允许。条件可以是声明表达式。表达式不能声明命名变量,声明也不能用作表达式。

第一个if的条件是如何评估的?

对变量进行初始化,并将其值转换为bool。如果生成true,则条件成功。

但它有标准保证吗?

是:

C++11 6.4/3作为switch语句以外的语句中的初始化声明的条件的值是在上下文中转换为bool的声明变量的值。

原因在于语言的语法。简而言之,if条件中的代码(以及类似的构造(可以是声明,也可以是表达式。当它是一个声明时,当然没有语法可以将声明的实体与某个东西进行比较。

当它是一个表达式时,它就像代码中其他任何地方的任何其他表达式一样。正如你不能写这个:

int foo() {
  bar(4 + (int b = 7));
}

您不能将其放入if中。

true进行比较的原因是,当if中的代码是声明时,条件被评估为"已声明的对象上下文转换为布尔"。

如何评估第一个CCD_ 18的条件?

就像你想的那样。以下

if( int* x = new int( 20 ) ) 
{   
    std::cout << *x << "!n";
    delete x;
}   

"大致"相当于

{
   int* x = new int( 20 );
   if( x ) 
   {   
       std::cout << *x << "!n";
       delete x;
   }   
}

并且在测试if( x )中,表达式x被隐式地转换为bool,其意味着if( x != 0 )(或if( x != NULL )(。