Ede*_*nia 2 c null pointers if-statement
在语法上它是有道理的(虽然它看起来像其他语言,我不是特别喜欢),它可以节省大量的打字和代码空间,但它有多糟糕?
if(p1 + (unsigned)p2 + (unsigned)p3 == NULL)
{
// all pointers are NULL, exit
}
Run Code Online (Sandbox Code Playgroud)
使用带有指针右值的指针算法,我看不出它是如何给出一个错误的结果(即使并非所有指针都是NULL,整个表达式也要求为NULL),但我不知道这可能会隐藏多少邪恶这样做是不是很糟糕,不常见的方法是检查是否有大量指针都是NULL?
关于问题的原始版本,省略了演员......
它可以节省大量的打字和代码空间,但它有多糟糕?
非常非常糟糕.它的行为完全未定义,如果你的编译器没有拒绝它,那么你应该让自己变得更好.在某些情况下定义一个指针从另一个指针的减法(并产生一个整数结果),但添加两个指针永远不会有意义.
因为它甚至不应该编译,所以用于键入它的每个键击而不是有效的东西都是浪费,所以不,它不会节省输入或代码空间.
我不知道它是如何产生错误结果的.
如果编译器实际接受它,结果可以是任何东西.这是未定义的.
这样做是不是很糟糕,不常见的方法是检查是否有大量指针都是NULL?
是.
关于修改后的问题,其中除了一个指针之外的所有指针都转换为整数:
演员不会拯救代码 - 仍然存在多个问题.
如果剩余指针未指向有效对象,或者整数之和为负或大于指针指向的数组中的元素数,则指针添加的结果仍未定义(其中指针标量被视为指向单元素数组的指针.当然,在这种特殊情况下,整数和不能为负,但这是最小的优势.
C不保证向整数转换空指针会产生值0.通常它会这样做,但语言不需要它.
C不保证非空指针转换为非零整数,并且您的特定代码是真正的风险.类型unsigned不一定足够大,不能为每个不同的指针提供不同的值.
即使所有上述内容对于某些特定实现都不是问题 - 也就是说,如果您可以安全地对NULL指针执行算术运算,并且NULL指针可靠地转换为整数为零,并且非NULL指针可靠地转换为非零 - - 测试仍然可能出错,因为两个非零无符号整数可以总和为零.这发生在两者的算术和等于的情况下UINT_MAX + 1.