我有一个函数,它接受两个字符串并返回另一个字符串(如果你必须知道,它是我的 strjoin 实现)。
现在,我想要这样做,如果其中一个输入字符串为 NULL,它将返回另一个字符串。
我想到的最直接的方法就是简单
if (!str1)
return (str2);
if (!str2)
return (str1);
但后来我想,让我们更进一步,尝试节省几行代码并在这个过程中学习一些东西。所以我想一定有某个运算符的结果是两个值中不为零的一个,并且我偶然发现了按位或运算符(|)。 当我尝试实现以下代码时,它说这些运算符仅适用于整数类型值,我想这有点道理,但我想知道是否有一种方法可以用非-整数:)
if (!(str1 && str2))
return (str1 | str2)
// error: expression must have integral type C/C++(31)
现在,因为问题出在数据类型上,我想我只需将其类型转换出来即可。所以我把它改成了
if (!(str1 && str2))
return ((char *)((int)str1 | (int)str2))
// segfault
它并不漂亮,但我认为它会以某种方式起作用。发生的事情实际上是一个段错误!但老实说,我无法解释为什么这会导致段错误 O_o 有人可以解释一下吗?
编辑:我知道我也可以使用三元运算符,但在我的学校这是禁止的:(
EDIT2:仅供参考,我知道我想做的一切都不是一个好主意,我永远不会在真正的代码中尝试这个。请理解这是出于教育目的,我只是想探索可能性,因为这就是人们学习的方式。
这个问题:
if (!(str1 && str2))
return ((char *)((int)str1 | (int)str2));
int
不一定与指针大小相同。 这意味着强制转换会丢失指针的部分值。
uintptr_t
类型是一种无符号类型,保证允许在指针类型之间进行转换,同时保留原始指针值,因此请改用它。
if (!(str1 && str2))
return ((char *)((uintptr_t)str1 | (uintptr_t)str2));