将数组用作c++中有效的条件表达式
Is using an array as a conditional expression valid in C++?
我有这样的代码:
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(除非发生错误,如堆栈粉碎)。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 欧拉项目#8答案是大以获得有效答案
- 在没有太多条件句的情况下,我如何避免被零除
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 在循环条件 i<sqrtN(预先计算)和 i*i<N 中,C++哪个更有效?
- C++ - 这个条件语句写得正确吗?还是有更有效的写法?
- 一个有效的图算法,满足以下条件
- C ,最有效的方法将大写速度更改为小写,反之亦然,而无需条件分支
- 类模板的成员函数有条件无效(隐式实例化有效;显式实例化失败)
- 编译时调度:以有效调用为条件
- 插入最有效的数据结构,然后使用不同的条件进行排序
- C++ - 按照特定条件对双向量进行分组的有效方法
- 如何有效地设计一种方法,使每个条件都依赖于另一个条件
- 将数组用作c++中有效的条件表达式
- 评估IF条件的最有效方法是什么?
- 为什么检查分配操作的结果有效,但不能与其他条件相结合
- 在预处理条件中使用布尔字面值是否有效?
- C++ -- 如何从 STL 容器中删除具有这种有效条件的元素
- c++有效的缓冲文本和有条件地将部分写入文本文件的方法