C 指针和 ||运营商

标签 c pointers casting logical-operators

我只是想知道这是否是 C89 程序的“好”代码。

obj_ptr = (obj*) (ptr1 || ptr2);

本质上,如果 ptr1 != NULL 和 ptr2,它的作用(至少在我的计算机上的 GCC 中)是将 obj_ptr 设置为 ptr1。

我环顾四周,看不出这是否合适,但从 || 的事实来看运算符必须将指针转换为整数,然后我必须将它们转换回去,这暗示了不良风格。

如果这是糟糕的风格或不可移植,是否有更好且(希望)同样简洁的解决方案?

编辑:我主要关心的是我编写的代码是否可移植并且不依赖于未定义的行为。

我可能找到了一种更好的方法,它是可移植的,而且我认为它是“好的风格”(除非你不喜欢 if 语句中的赋值)。

if(!(obj_ptr = ptr1))
    obj_ptr = ptr2;

最佳答案

不,如果 ptr1 不为 NULL 或者 ptr2 为 NULL,它所做的是将 obj_ptr 设置为 1不为 NULL,否则为 0。您需要使用三元运算符:

obj_ptr = ptr1 ? ptr1 : ptr2;

关于C 指针和 ||运营商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7368991/

相关文章:

c - 面向对象的 ANSI C?

c - 操纵可变参数的标准方法?

c - 如何正确返回结构数组(在此 codewars 示例中)?

c - 修改常量变量(const)

c - 处理双重间接时避免不兼容的指针警告

c - 项求和未返回正确结果

c - 如何将数学方程式(求和)转换为代码?

c++ - 动态创建的数组

c++ - 从 double 到整数的显式类型转换是否总是检查整数溢出?

c++ - 使用 static_cast 向下转型 - 指针和对象