关于表达式声明(示例)
i = 1;
据说,在将1
分配给i
后,整个表达式的值将被丢弃 。如果该值被丢弃,那么以后如何在程序中使用该值,例如
printf("%d",i);
?
我知道这是一个非常基本的问题,但我真的很困惑丢弃。
答案 0 :(得分:5)
表达式的值确实已被丢弃,但此表达式具有副作用 - 它会更改i
的值。因此,下次您将访问此变量时,您将读取新值,即1。
当您执行foo(5);
甚至简单"hello";
之类的操作时,“丢弃”一词更有用。由于表达式"hello"
没有任何副作用,并且它的值被确定,因此它绝对没有任何效果。当编译器遇到它时,作为一个独立的声明:
"hello";
它可能完全忽略它,就好像根本不存在一样。这是调用函数或使用运算符时发生的情况:
4+5;
sin(2.6);
这些表达式也没有副作用,它们的值被忽略。当你做
之类的事情printf("hello");
这也是一个表达。它的值是写入的字符总数。该值被忽略。但是这个表达式一定不能被忽略,因为它有一个重要的副作用:它将这些字符打印到标准输出。
所以让我们构建一个函数而不是使用赋值运算符(因为C没有引用,我们将使用指针):
int assign_int(int* var, int value) {
*var = value;
return *var;
}
现在,回到你的例子,你做了类似的事情:
assign_int(&i, 1);
从assign_int
返回的值已弃用。就像printf()
案例一样。但由于函数assign_int
有副作用(改变i的值),编译器不会忽略它。
答案 1 :(得分:2)
重点是i = 1
有两个属性。
i
中的值更改为1 第二部分很有意思,就像
一样if ( (i=1) == 2 ) { // ...
或
y = 3 + (i = 1); // assign 4 to y
该行
整个表达式的值被丢弃。
表示表达式的值(我的#2),但不影响对变量i
(我的#1)的赋值。