作为赋值错误的左操作数所需的l值 - 但为什么呢?

时间:2012-01-16 18:36:34

标签: c

一般来说,我知道你为什么会遇到这个错误,但在这个特殊情况下我有点困惑......

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* mystrncpy(char* dst, const char* src, size_t n) {
    char* temp = dst;

    while (n-- > 0 && (*temp = *src)) {
        temp++;
        src++;
    }

    return dst;
}

int main() {
    const char* str = "Hello World!";
    char buf[50];
    memset(buf, 0, sizeof(buf));
    mystrncpy(buf, str, sizeof(buf));
    printf("%s\n", buf);
}

上面的代码效果很好,但如果我删除额外的括号集,将while循环更改为:

while (n-- > 0 && *temp = *src)

然后我收到错误。我想这是关于运算符优先级的事情,但我有点困惑。有人可以解释while循环更改会导致出现此编译器错误吗?

5 个答案:

答案 0 :(得分:5)

是的,这是优先权。

=的优先级低于&&。因此,后一种情况解析为:

while ((n-- > 0 && *temp) = *src)

当然(n-- > 0 && *temp)不是l值。

您确定不打算使用==代替=吗?

答案 1 :(得分:4)

    n-- > 0 && *temp = *src
                           =
                          / \
                         &&  *src
                        /  \
                       >    *temp
                      / \
                    n--  0

答案 2 :(得分:2)

作业的precedence非常低,所以

n-- > 0 && *temp = *src

相当于

(n-- > 0 && *temp) = *src

无效C.

答案 3 :(得分:0)

Operator precedence。和&amp;&amp;运算符在13位,= 16。

答案 4 :(得分:0)

赋值运算符的优先级非常低,所以就像你试图分配n-- > 0 && *temp的结果一样,这显然不是左值。