1

关于表达式语句(示例)

i = 1;

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

printf("%d",i);

?
我知道这是一个非常基本的问题,但我真的对discarded感到困惑。

4

2 回答 2

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 的值),编译器不会忽略它。

于 2013-06-30T22:42:09.707 回答
2

重要的一点是i = 1有两个属性。

  1. 它将存储在变量中的值更改i为 1
  2. 它是一个表达式并且有一个值(也是 1);

第二部分很有趣是这样的案例

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

或者

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

线

整个表达式的值被丢弃。

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

于 2013-06-30T22:45:52.037 回答