c - 左值需要作为赋值错误的左操作数——但为什么呢?

标签 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 循环更改是如何导致出现此编译器错误的吗?

最佳答案

是的,这是关于优先级的。

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

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

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

您确定您不打算使用 == 而不是 = 吗?

关于c - 左值需要作为赋值错误的左操作数——但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8884665/

相关文章:

objective-c - Cocoa Objective-C 主循环

c - 我应该添加哪个库来解决 fcntl64、stat64 等问题?

c - 在 c 中将条件语句编写为 (value == variable) 而不是 (variable == value)

c - 如何在程序中自动插入 pragma

c - 对字符串数组使用动态内存分配

c - 下标值既不是数组也不是指针也不是 vector

将 fortran-iso-c-binding real 变量转换为 real

将编译时常量字符串与字符代码来自#define 的字符连接起来

c - 如何在cmd窗口输出特殊字符?

c - 在存储在文件中的数字中找到再次出现的数字