while (curr_data[1] != (unsigned int)NULL &&
((curr_ptr = (void*)curr_data[1]) || 1))
两部分问题。
(curr_ptr = (void*)curr_data[1])
在逻辑上评估什么。 TRUE
?
另外,我知道它很苛刻,但是while
声明合法C?我不得不经历严厉的扭曲,将作业放在代码的其他地方,所以如果我能把它留在那里我真的很好,但是如果它如此令人震惊,它会让每个人的眼球都迸发出火焰,我会改变它
答案 0 :(得分:3)
(curr_ptr = (void*)curr_data[1])
将评估为TRUE,除非它是空指针。
假设curr_data
是一个指针数组,你想要做的是在第二个指针不为空时运行循环,同时将其值赋给curr_ptr
,我会做:
while ((curr_ptr = (void*)curr_data[1]) != NULL) { ... }
答案 1 :(得分:2)
回答你的问题:
curr_ptr
未设置为NULL
,则评估为true(即curr_data[1]
不为0)。无论如何,我假设你没有写这段代码,因为你正在讨论将它留下而不是把它拿出去。所以我希望你找出谁写了这行代码并将它们介绍给一个沉重的钝器。
(unsigned int)NULL
很荒谬。你为什么要这样做?这可能与编写0
相同(不确定标准是否保证)。curr_data[1]
中有哪些数据被强制转换为指针(并且指针被强制转换为指针)?如果它应该将指针作为整数类型,那么您应该使用intptr_t
中提供的类型uintptr_t
来实现该目的(如果您的编译器不支持C99) <stdint.h>
可能是可接受的替代品。)ptrdiff_t
似乎是多余的。如果|| 1
评估为false,我们就会在第一个条件下捕获它。这可能是一个痛苦的屁股,但严重重新考虑改写这条线。它看起来像是IOCCC的一个条目。
答案 2 :(得分:1)
作业是C中的表达式,所以你的作品。将;
更改为{}
意味着完全相同的事情,并且更加清晰,至少可以做出改变。如果你有一个更清晰的替代方案(通常是正确的),应该避免条件中的分配,但如果在这个地方这是最清楚的,那么使用它。
分配的结果是分配给对象。 a = value
将执行分配,然后评估为a
。这用于执行a = b = 0
。
要进一步清理代码,不需要进行void转换,如果这是字符,请使用'\ 0'(空字符)而不是NULL(应该只与指针一起使用)。< / p>
答案 3 :(得分:0)
你不必经历“大扭曲”,这完全等同于
while (curr_data[1]) {
curr_ptr = (void *)curr_data[1];