C中赋值的逻辑值

时间:2009-12-02 08:40:42

标签: c coding-style logical-operators variable-assignment

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

两部分问题。

(curr_ptr = (void*)curr_data[1])在逻辑上评估什么。 TRUE

另外,我知道它很苛刻,但是while声明合法C?我不得不经历严厉的扭曲,将作业放在代码的其他地方,所以如果我能把它留在那里我真的很好,但是如果它如此令人震惊,它会让每个人的眼球都迸发出火焰,我会改变它

4 个答案:

答案 0 :(得分:3)

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

假设curr_data是一个指针数组,你想要做的是在第二个指针不为空时运行循环,同时将其值赋给curr_ptr,我会做:

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

答案 1 :(得分:2)

回答你的问题:

  1. 如果curr_ptr未设置为NULL,则评估为true(即curr_data[1]不为0)。
  2. 我认为这是合法的,但这行代码存在更大的问题。
  3. 无论如何,我假设你没有写这段代码,因为你正在讨论将它留下而不是把它拿出去。所以我希望你找出谁写了这行代码并将它们介绍给一个沉重的钝器。

    1. (unsigned int)NULL很荒谬。你为什么要这样做?这可能与编写0相同(不确定标准是否保证)。
    2. curr_data[1]中有哪些数据被强制转换为指针(并且指针被强制转换为指针)?如果它应该将指针作为整数类型,那么您应该使用intptr_t中提供的类型uintptr_t来实现该目的(如果您的编译器不支持C99) <stdint.h>可能是可接受的替代品。)
    3. 最后的ptrdiff_t似乎是多余的。如果|| 1评估为false,我们就会在第一个条件下捕获它。
    4. 这可能是一个痛苦的屁股,但严重重新考虑改写这条线。它看起来像是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];