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

两部分问题。

什么会 (curr_ptr = (void*)curr_data[1]) 合乎逻辑地评估。 TRUE?

另外,我知道它相当黑客,但是 while 声明合法 C?我必须经过巨大的扭曲才能将作业放在代码中的其他地方,所以如果我能把它留在那里,我会非常高兴,但如果它是如此令人震惊,以至于让每个人的眼球都燃烧起来,我会改变它。

有帮助吗?

解决方案

回答您的问题:

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

无论如何,我假设您没有编写这段代码,因为您正在争论是否将其保留在 VS 中。把它拿出来。所以我想让你找出这行代码是谁写的,并向他们介绍一个沉重的钝器。

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

这可能很麻烦,但请认真重新考虑重写这一行。它看起来像是 IOCCC 中的一个条目。

其他提示

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

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

while ((curr_ptr = (void*)curr_data[1]) != NULL) { ... }

赋值是 C 语言中的表达式,所以你所拥有的都是有效的。改变 ;{} 意思是完全相同的,而且更清楚,至少要改变一下。当您有更清晰的替代方案(通常是正确的)时,应避免在条件中进行赋值,但如果此位置最清晰,则使用它。

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

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

你不必经历“巨大的扭曲”,这完全相当于

while (curr_data[1]) {
    curr_ptr = (void *)curr_data[1];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top