1
while (curr_data[1] != (unsigned int)NULL &&
    ((curr_ptr = (void*)curr_data[1]) || 1))

两部分问题。

(curr_ptr = (void*)curr_data[1])从逻辑上讲,评估结果是什么。TRUE?

另外,我知道它相当骇人听闻,但while声明是合法的 C 吗?我必须经过极大的扭曲才能将作业放在代码中的其他位置,所以如果我可以把它留在那里,我会非常好,但如果它太令人震惊以至于让每个人的眼球都燃烧起来,我会改变它.

4

4 回答 4

3

(curr_ptr = (void*)curr_data[1])除非它是空指针,否则将评估为 TRUE。

假设这curr_data是一个指针数组,并且您要做的是在这些指针中的第二个不为空时运行循环,同时将其值分配给curr_ptr,我会这样做:

while ((curr_ptr = (void*)curr_data[1]) != NULL) { ... }
于 2009-12-02T08:45:12.190 回答
2

要回答您的问题:

  1. curr_ptr如果未设置为NULL(即curr_data[1]不是 0),它将评估为 true 。
  2. 我相信这是合法的,但是这行代码存在更大的问题。

无论如何,我假设您没有编写此代码,因为您正在争论将其保留还是取出。所以我想让你找出这行代码是谁写的,并将他们介绍给一个笨重的对象。

  1. (unsigned int)NULL很荒谬。你为什么要这样做?这可能与编写相同0(不确定标准是否保证)。
  2. curr_data[1]如果它被转换为指针(并且指针被转换为它),它是什么类型的数据?如果它应该将指针作为整数类型保存,则应使用该类型intptr_t或为此uintptr_t提供 in (如果您的编译器不支持 C99可能是可接受的替代品)。<stdint.h>ptrdiff_t
  3. 最后|| 1的似乎是多余的。如果curr_ptr = (void*)curr_data[1]会被评估为假,我们会在第一个条件下抓住它。

这可能会让人头疼,但请认真重新考虑重写这一行。它看起来像 IOCCC 中的一个条目。

于 2009-12-02T08:51:29.620 回答
1

作业是 C 中的表达式,所以你有什么工作。更改;to{}意味着完全相同的事情并且更清晰,至少要进行更改。当您有更清晰的替代方案(通常是正确的)时,应避免在条件中分配,但如果在这个地方这是最清楚的,那么就使用它。

赋值的结果是被赋值的对象。 a = value将完成分配,然后评估为a. 这用于做类似的事情a = b = 0

为了进一步清理代码,不需要 void 强制转换,如果这是字符,请使用 '\0' (空字符)而不是 NULL (应该只与指针一起使用)。

于 2009-12-02T08:52:39.180 回答
0

您不必经历“巨大的扭曲”,这完全等同于

while (curr_data[1]) {
    curr_ptr = (void *)curr_data[1];
于 2009-12-02T08:57:43.273 回答