-
11-09-2019 - |
题
while (curr_data[1] != (unsigned int)NULL &&
((curr_ptr = (void*)curr_data[1]) || 1))
两部分问题。
什么会 (curr_ptr = (void*)curr_data[1])
合乎逻辑地评估。 TRUE
?
另外,我知道它相当黑客,但是 while
声明合法 C?我必须经过巨大的扭曲才能将作业放在代码中的其他地方,所以如果我能把它留在那里,我会非常高兴,但如果它是如此令人震惊,以至于让每个人的眼球都燃烧起来,我会改变它。
解决方案
回答您的问题:
- 如果以下情况,它将评估为 true
curr_ptr
没有设置为NULL
(IE。curr_data[1]
不是 0)。 - 我相信这是合法的,但是这行代码存在更大的问题。
无论如何,我假设您没有编写这段代码,因为您正在争论是否将其保留在 VS 中。把它拿出来。所以我想让你找出这行代码是谁写的,并向他们介绍一个沉重的钝器。
(unsigned int)NULL
太荒谬了。你为什么要这样做?这可能和刚刚写的一样0
(不确定标准是否保证)。- 里面有什么类型的数据
curr_data[1]
如果它被转换为指针(并且指针被转换为它)?如果它应该将指针作为整型类型保存,则应该使用该类型intptr_t
或者uintptr_t
提供于<stdint.h>
为此目的(如果你的编译器不支持 C99ptrdiff_t
可能是可接受的替代品)。 - 这
|| 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];
不隶属于 StackOverflow