将数组用作c++中有效的条件表达式

Is using an array as a conditional expression valid in C++?

本文关键字:有效 条件 表达式 c++ 数组      更新时间:2023-10-16

我有这样的代码:

int main()
{
    char buffer[10];
    if( buffer ) {
       return 1;
    }
    return 0;
}

, visualc++ 10将其解释为:buffer衰减为指针,然后将指针与null进行比较。当使用/O2编译时,检查被消除,代码相当于仅return 1;

上面的代码有效吗?Visual c++编译正确吗(我指的是衰减部分,而不是优化部分)?

c++ 1,1,4/4:

为表达式的条件的值为表达式,在上下文环境中将其转换为bool,用于除开关;如果转换是病态的,那么程序就是病态的。

因此,标准规定编译器必须执行任意隐式转换,以将数组转换为布尔值。将数组衰减为指针,并将指针转换为布尔值,并通过一个反相等测试将其转换为null是一种方法,因此,程序是定义良好的,并且确实产生了正确的结果——显然,由于数组是在堆栈上分配的,因此它衰减到的指针永远不可能等于空指针。

更新:至于为什么要遵循这两个转换链:

4.2/1:

c++ 11日

类型为"N - T的数组"或"边界未知的数组"的左值或右值可转换为"指向T的指针"类型的右值。结果指向数组第一个元素的指针。

因此,从数组类型到指向元素类型的指针的唯一合法转换是。第一步是没有选择的。

4.12/1:

c++ 11日

非作用域算术枚举的右值、指针或指针to成员类型可以转换为bool类型的右值。一个零值、空指针值或空成员指针值进行转换至false;其他值转换为true。类型的右值std::nullptr_t可以转换为bool类型的右值;的结果值为false

有一个直接从裸指针到布尔值的隐式转换;因此,编译器选择它作为第二步,因为它允许立即获得所需的结果(转换为布尔值)。

是的,从数组类型到bool的转换是由标准转换定义的。引用c++ 11.4/1(突出显示相关转换):

标准转换序列是下列标准转换的序列秩序:

- 0个或1个下列集合的转换:左值到右值的转换,数组到指针的转换,以及函数到指针的转换。

-从以下集合进行0或1次转换:整升序,浮点升序,整升序转换,浮点转换,浮点整型转换,指针转换,指针指向布尔值转换

-零或一个限定转换。

如果有必要,将对表达式应用标准转换序列,以便将其转换为必需的表达式目的地类型。

可以。

if( buffer )表示:检查buffer是否为NULL。数组变量指向数组的开头(除非移动它),相当于指针。

优化只返回1,因为buffer是在堆栈上分配的,所以它肯定有一个值(指向堆栈上的位置的指针),所以它总是为真。

你自己说的:

缓冲区衰减为指针

由于数组在堆栈上,所以它不能为NULL(除非发生错误,如堆栈粉碎)。