如何在程序中稍后使用丢弃的值

时间:2013-06-30 22:40:36

标签: c expression

关于表达式声明(示例)

i = 1;

据说,在将1分配给i 后,整个表达式的值将被丢弃 。如果该值被丢弃,那么以后如何在程序中使用该值,例如

printf("%d",i);


我知道这是一个非常基本的问题,但我真的很困惑丢弃

2 个答案:

答案 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有两个属性。

  1. 它将存储在变量i中的值更改为1
  2. 这是一个表达式并且有一个值(也是1);
  3. 第二部分很有意思,就像

    一样
    if ( (i=1) == 2 ) {  // ...
    

    y = 3 + (i = 1); // assign 4 to y
    

    该行

      

    整个表达式的值被丢弃。

    表示表达式的(我的#2),但不影响对变量i(我的#1)的赋值。