我们在用户输入期间使用&符号,但为什么我们在 C 中的赋值期间不需要这个?

Soh*_*lah 3 c memory addressing

我们在用户输入期间使用&符号(&)运算符。这意味着我们将特定值分配给特定变量的内存地址。但是在赋值期间,我们不需要&符号。在没有任何内存地址规范的情况下如何传递值?下面给出了示例代码。

#include<stdio.h>

int main()
{
    int a, b, total;
    scanf("%d%d", &a, &b); //& for memory address
    total = a+b;           //how the value is being tranfarred to total without any memory address?   
    printf("%d", total);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 5

scanf函数必须访问正在读取值的对象。所有 C 函数参数都是按值传递的,所以如果你写

int a, b;
scanf("%d%d", a, b); // THIS IS WRONG
Run Code Online (Sandbox Code Playgroud)

scanf功能只能够看到的价值观ab,因为他们被称为功能时。那就没办法修改了a

赋值需要一个左值作为其左操作数。左值(稍微简化)是指定对象的表达式;变量名是最常见的一种左值。由于赋值运算符=内置于语言中,因此它可以具有适用于它的特殊规则。特别是,LHS 上的左值=标识了被分配给的对象;它不会产生该对象的(前一个)值。这就是语言如何定义赋值的。

例如,如果你写:

a = b;
Run Code Online (Sandbox Code Playgroud)

这两个ab是左值,但他们对待,因为它们的上下文的不同。a指的是名称为 的对象ab也指一个对象,但在那个上下文中它产生那个对象的当前值。

如果赋值是作为函数调用来实现的,它就必须获取被赋值的对象的地址:

int assign(int *lhs, int rhs);
assign(&a, b);
Run Code Online (Sandbox Code Playgroud)

该语言可能需要一个分配的 LHS 的地址,但只允许目标对象的名称要方便得多。

(为了解释上面的简化,当前标准对lvalue的定义是“一个可能指定一个对象的表达式(具有除 void 以外的对象类型)”。“potentially”这个词的存在是因为,例如,*ptrwhere ptris a pointer 是即使当前值为ptrisNULL的左值。作为左值是一个编译时概念。尝试为其赋值*ptr是合法的,但具有未定义的行为。)

  • @Edenia 我认为当给定一个 NULL 指针并返回 0 时,`scanf` 族也可能很友好,但 C 不是一种非常友好的语言。 (2认同)