C++ 在if语句的条件部分定义变量不允许比较其值。为什么?

C++ 在if语句的条件部分定义变量不允许比较其值。为什么?,c++,variables,if-statement,standards,C++,Variables,If Statement,Standards,总结 此问题与: 那么,为什么我不能在同一个地方检查新定义变量的值呢 简单例子 换句话说,这是允许从链接的问题: if( int* x = new int( 20 ) ) { std::cout << *x << "!\n"; delete x; } 问题: 这里可能还有一个更重要的问题——第一个if的条件如何评估?根据我的测试,这两个选项的作用似乎是相同的——有针对false 0、NULL等的隐式检查。但这有标准保证吗 现实世界的例子 好

总结

此问题与:

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

简单例子

换句话说,这是允许从链接的问题:

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

这里可能还有一个更重要的问题——第一个if的条件如何评估?根据我的测试,这两个选项的作用似乎是相同的——有针对false 0、NULL等的隐式检查。但这有标准保证吗

现实世界的例子

好的,我不能根据一些自定义值检查新变量,但我可以将其与false进行比较。这里有一个真实的例子:我有一个类,包含一个模板方法:check\u class。此方法对内部指针进行动态\u转换。现在我想像这样使用它:

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的状况如何评估

就像你想的那样。以下

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或如果x!=空

第一个if的状况如何评估

就像你想的那样。以下

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或如果x!=空。

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

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

int foo() {
  bar(4 + (int b = 7));
}
您不能将其放入if中


它之所以能与true进行比较,是因为当if中的代码是一个声明时,条件作为声明的对象进行计算,并在上下文中转换为bool。

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

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

int foo() {
  bar(4 + (int b = 7));
}
您不能将其放入if中

它之所以能够与true进行比较,是因为当if中的代码是一个声明时,条件将作为声明的对象进行计算,并在上下文中转换为bool

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


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

第一个if的状况如何评估

初始化变量,并将其值转换为布尔值。如果结果为真,则条件成功

但这有标准保证吗

是的:

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

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


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

第一个if的状况如何评估

初始化变量,并将其值转换为布尔值。如果结果为真,则条件成功

但这有标准保证吗

是的:

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


这段代码看起来让我很困惑。@DanielDaranas-到底是哪一部分?你可以。在。@KirilKirov中,任何作为次要效果的布尔表达式,例如int*x=new int20 in if.。问题与试图编写以下语句完全相同:“NULL!”int*x=新的int 20;'。这段代码看起来让我很困惑。@DanielDaranas-到底是哪一部分?你可以。在。@KirilKirov中,任何作为次要效果的布尔表达式,例如int*x=new int20 in if.。问题与试图编写以下语句完全相同:“NULL!”int*x=新的int 20;'。条件可以是声明,也可以是表达式——这解释了很多。引用标准总是一个很大的优点。谢谢。条件可以是声明,也可以是表达式——这解释了很多。还有一句话
从标准来看,这总是一个很大的优势。谢谢,谢谢,我不知道。回答很好,我接受了另一个,因为引用了标准+谢谢,我不知道。回答很好,我接受了另一个,因为引用了标准+从我这里得到1。