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。