在if语句的条件部分定义变量不允许对其值进行比较.为什么?
Defining a variable in the condition part of an if-statement does not allow comparison of its value. Why?
摘要
这个问题与:在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
(0
、NULL
,不管怎样(的隐式检查。但它有标准保证吗?
真实世界示例
好吧,我不能将新变量与某些自定义值进行比较,但我可以将其与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 )
(。
- 为什么比较运算符如此快速
- 为什么:不同符号的整数比较只是偶尔发生?
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 为什么组合的上限和下限比较的计算结果总是为 true?
- 为什么 Boost multi_index只修改第一个索引的键时对第二个索引进行比较?
- 为什么我的比较运算符不比较我的点长和双精度值?
- 为什么 std::stable_sort() 的比较函数的参数必须是设置常量?
- 为什么'Hello'与CPP中的'World'进行比较时被打印出来?
- 为什么在类或结构中传递自定义比较器函数?
- 浮点数比较为什么没有相等的函数
- 为什么 std::variant 找不到运算符<() 当与比较类不在同一命名空间中时
- 为什么sub_match和basic_string比较运算符使用额外的字符串副本实现?
- 为什么Visual Studio没有对逻辑比较错误进行热身?
- 为什么地图需要实现'operator<'以及如何比较对象?
- 为什么C++容器之间存在比较运算符
- 为什么我不能将字符与"*"进行比较?
- 为什么与<运算符的向量比较会比较每个项目两次?
- C++ 字符串() 与 c 字符串的比较.为什么会这样
- 在if语句的条件部分定义变量不允许对其值进行比较.为什么?
- 字符串bool比较-为什么