C++ 将数组用作在C+中有效的条件表达式+;?
我有以下代码:C++ 将数组用作在C+中有效的条件表达式+;?,c++,arrays,pointers,C++,Arrays,Pointers,我有以下代码: int main() { char buffer[10]; if( buffer ) { return 1; } return 0; } 衰变到指针,然后指针与null进行比较。当使用/O2编译时,检查被消除,代码只相当于返回1 上面的代码有效吗?Visual C++是否正确编译(我是指衰减部分,而不是优化部分)? < P>是。 if(buffer)表示:检查buffer是否为NULL。数组变量指向数组的开头(除非移动它),相当于指
int main()
{
char buffer[10];
if( buffer ) {
return 1;
}
return 0;
}
返回1代码>
上面的代码有效吗?Visual C++是否正确编译(我是指衰减部分,而不是优化部分)? < P>是。
if(buffer)
表示:检查buffer
是否为NULL
。数组变量指向数组的开头(除非移动它),相当于指针
优化只返回1,因为buffer
是在堆栈上分配的,所以它肯定有一个值(指向堆栈上位置的指针),所以它总是正确的。C++11,6.4/4:
作为表达式的条件的值是
表达式,对于非
转换如果这种转换不正确,程序就不太好
因此,标准规定编译器必须执行任意隐式转换,才能将数组转换为布尔值。将数组衰减为指针,并将指针转换为布尔值,并对其进行反相等测试,将其转换为null是实现这一点的一种方法,因此,是的,程序定义良好,是的,它确实生成正确的结果——显然,由于数组是在堆栈上分配的,因此它衰减到的指针永远不会等于null指针
更新:关于为什么遵循这两个转换链:
C++11,4.2/1:
“N T数组”或“未知界数组”类型的左值或右值
可将“T的指针”转换为“T的指针”类型的PR值。结果
是指向数组第一个元素的指针
因此,从数组类型到元素类型的唯一合法转换是指向元素类型的指针。第一步别无选择
C++11,4.12/1:
算术、非范围枚举、指针或指针的PR值
to成员类型可以转换为类型为bool
的prvalue。零
转换值、空指针值或空成员指针值
至false
;任何其他值都将转换为true
。类型的值
std::nullptr\u t
可以转换为bool
类型的PR值;这个
结果值为false
有一个直接从裸指针到布尔值的隐式转换;因此编译器选择这作为第二步,因为它允许立即达到所需的结果(转换为布尔值)。您自己说过:
缓冲区衰减为指针
由于数组位于堆栈上,因此它不能为NULL(除非出现错误,如堆栈崩溃)。是的,从数组类型到bool
的转换由标准转换定义良好。引用C++11,4/1(突出显示相关转换):
标准转换序列是以下格式的标准转换序列
订单:
-以下集合的零或一个转换:左值到右值转换,数组到指针转换,
和函数到指针的转换
-以下集合的零或一个转换:积分促销、浮点提升、积分
转换,浮点转换,浮点积分转换,指针转换,指针到
成员转换和布尔转换
-零或一个资格转换
如果需要将表达式转换为所需的表达式,则将对其应用标准转换序列
目的地类型
至少对我来说,省略优化似乎是完全合理的。好吧,这是一种方法,但为什么要使用这种方法?@sharptooth:经过编辑和改进,现在使用了更标准的语言。数组不等同于指针;它是一个单独的类型,如果需要,可以转换为指针。