Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将数组用作在C+中有效的条件表达式+;?_C++_Arrays_Pointers - Fatal编程技术网

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;
}
缓冲区< /代码>衰变到指针,然后指针与null进行比较。当使用/O2编译时,检查被消除,代码只相当于
返回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:经过编辑和改进,现在使用了更标准的语言。数组不等同于指针;它是一个单独的类型,如果需要,可以转换为指针。