C语言什么时候用&运算符?
When do you use the & operator in C language?
我从我的笔记中查看了这个示例,它不包括 & 运算符,&i,在循环打印时 i 之前
#include <stdio.h>
int main() {
int i;
for (i = 1; i < 11; ++i)
{
printf("%d ", i);
}
return 0;
}
什么时候使用 & 运算符比较合适,为什么这里不使用它。你只需要在使用 scanf 时使用它还是它也需要在 printf 中使用?
通常,当您需要对象的值时,您只需使用对象的名称,例如 i
。在printf("%d ", i)
中,我们希望printf
打印出i
的值,所以直接传i
.
在scanf("%d", …)
中,我们不想告诉scanf
i
的值是什么。我们希望 scanf
更改 i
。为此,我们必须为 scanf
提供一些对 i
的引用。为此,我们给 scanf
i
的地址,其中 scanf("%d", &i)
.
因此,在将参数传递给例程时,如果要将对象的地址传递给该例程,您将使用 &
。如果要传值就不用&
.
从技术上讲,每当我们在表达式中写入 i
时,它指定的是对象 i
,而不是它的值。但是,在许多情况下,对象会自动转换为其值。所以,在 printf("%d", i*3);
中,对象 i
自动转换为它的值,然后将值乘以 3。这是语言的自动部分,而且效果很好,所以你很少有考虑一下。
这种将对象自动转换为其值的方式称为左值转换。它有一些例外。在这些情况下,我们希望使用对象 i
而不是它的值:
- 在作业中,例如
i = 3;
,我们希望作业更改 i
。
- 在
sizeof i
中,我们想要对象的大小 i
,而不是它的值或它的值的大小。
- 在
&i
中,我们要的是i
的地址,而不是其值的地址。
- 在
++i
、i++
、--i
、i--
中,我们要修改对象i
。
在所有这些情况下,都不会自动将对象转换为其值。这是C语言设计的一部分。
还有两个例外:
- 使用用于访问结构或联合成员的运算符
.
,左操作数不会转换为其值。因此,如果 s
是一个结构,那么在 s.i
中,s
仍然是结构的名称,表达式 s.i
则指定成员 i
那个结构的。 (要继续计算 this 出现的表达式,然后将该成员转换为其值,除非它也出现在这些异常之一中。)
- 如果对象是数组,则不会将其转换为其值。 (根据数组的单独规则,它通常被转换为指向其第一个元素的指针。)
我从我的笔记中查看了这个示例,它不包括 & 运算符,&i,在循环打印时 i 之前
#include <stdio.h>
int main() {
int i;
for (i = 1; i < 11; ++i)
{
printf("%d ", i);
}
return 0;
}
什么时候使用 & 运算符比较合适,为什么这里不使用它。你只需要在使用 scanf 时使用它还是它也需要在 printf 中使用?
通常,当您需要对象的值时,您只需使用对象的名称,例如 i
。在printf("%d ", i)
中,我们希望printf
打印出i
的值,所以直接传i
.
在scanf("%d", …)
中,我们不想告诉scanf
i
的值是什么。我们希望 scanf
更改 i
。为此,我们必须为 scanf
提供一些对 i
的引用。为此,我们给 scanf
i
的地址,其中 scanf("%d", &i)
.
因此,在将参数传递给例程时,如果要将对象的地址传递给该例程,您将使用 &
。如果要传值就不用&
.
从技术上讲,每当我们在表达式中写入 i
时,它指定的是对象 i
,而不是它的值。但是,在许多情况下,对象会自动转换为其值。所以,在 printf("%d", i*3);
中,对象 i
自动转换为它的值,然后将值乘以 3。这是语言的自动部分,而且效果很好,所以你很少有考虑一下。
这种将对象自动转换为其值的方式称为左值转换。它有一些例外。在这些情况下,我们希望使用对象 i
而不是它的值:
- 在作业中,例如
i = 3;
,我们希望作业更改i
。 - 在
sizeof i
中,我们想要对象的大小i
,而不是它的值或它的值的大小。 - 在
&i
中,我们要的是i
的地址,而不是其值的地址。 - 在
++i
、i++
、--i
、i--
中,我们要修改对象i
。
在所有这些情况下,都不会自动将对象转换为其值。这是C语言设计的一部分。
还有两个例外:
- 使用用于访问结构或联合成员的运算符
.
,左操作数不会转换为其值。因此,如果s
是一个结构,那么在s.i
中,s
仍然是结构的名称,表达式s.i
则指定成员i
那个结构的。 (要继续计算 this 出现的表达式,然后将该成员转换为其值,除非它也出现在这些异常之一中。) - 如果对象是数组,则不会将其转换为其值。 (根据数组的单独规则,它通常被转换为指向其第一个元素的指针。)