C指针和|| 运营商

Tne*_*ond 1 c pointers casting logical-operators

我只是想知道这是否是C89程序的"好"代码.

obj_ptr = (obj*) (ptr1 || ptr2);
Run Code Online (Sandbox Code Playgroud)

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

我环顾四周,看不出这是否正确,但从||的事实判断 运算符必须将指针转换为整数然后我必须将它们抛回来是一种不好的风格.

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

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

我可能找到了一种更好的便携方式,我认为它是"好的风格"(除非你不喜欢if语句中的赋值).

if(!(obj_ptr = ptr1))
    obj_ptr = ptr2;
Run Code Online (Sandbox Code Playgroud)

Set*_*gie 10

不,它被设置obj_ptr1如果任一ptr1不为NULL或ptr2不为空,和0其他.您需要使用三元运算符:

obj_ptr = ptr1 ? ptr1 : ptr2;
Run Code Online (Sandbox Code Playgroud)

  • @Tnelsond:用'%p'打印值,如果你没有得到'0x1`,我会感到惊讶. (2认同)

Nem*_*emo 7

好吧,它肯定在C++中无效(两个操作数都被提升bool).我承认我不确定C.

[更新]好的,找到它,C99规格6.5.14节:

语义

|| 如果操作数的任何一个比较不等于0,则运算符应该为1; 否则,它产生0.结果类型为int.

因此||始终评估为0或1.

制定该表达式的通常方法是:

obj_ptr = (ptr1 ? ptr1 : ptr2);
Run Code Online (Sandbox Code Playgroud)

如果你真的需要(obj*)演员表,你很可能会做错事.