【问题标题】:Not able to understand the working of Pre-increment/ Pre-decrement in C++无法理解 C++ 中预增量/预减量的工作原理
【发布时间】:2017-12-06 10:22:44
【问题描述】:

有人可以解释一下以下代码中发生了什么吗? (取自 GeeksForGeeks)

int main(){
 int a = 10;
 ++a = 20; // works
 printf("a = %d", a);
 getchar();
 return 0;
}

执行语句 ++a = 20 时究竟发生了什么?另外,请说明为什么这段代码执行失败?

int main(){
    int a = 10;
    a++ = 20; // error 
    printf("a = %d", a);
    getchar();
    return 0;
 }

代码取自:http://www.geeksforgeeks.org/g-fact-40/

【问题讨论】:

  • 我相信这是未定义的行为。
  • 当然在c中不起作用。
  • @eof 它在 python 中也不起作用。你想说什么?这里没有人谈论 C。
  • @tilz0R gcc 对此给出了错误。我猜这意味着它不是UB
  • @FedericoklezCulloca 这个问题最初也被标记为c

标签: c++ operators pre-increment


【解决方案1】:

赋值运算符的左操作数应该是左值。
表达式++a 是左值,而a++ 不是,因此它不能是赋值运算符的左操作数。

n3797-§ 5.3.3(p1):

[...] 结果是更新后的操作数;它是一个左值 [...]

【讨论】:

  • 你说的是C还是C++?在 C 中,AFAIK 都不是左值。
  • @EOF;这是关于 C++ 的。是的,在 C++ 中,++a 是一个左值。
  • @EOF;添加了参考。
【解决方案2】:

当你这样做时

++a = 20;

大致相当于

a = a + 1;
a = 20;

但是当你这样做时

a++ = 20;

大致相当于

int temp = a;
a = a + 1;
temp = 20;

但是变量temp 并不存在。 a++ 的结果是一个叫做 rvalue 的东西,它们不能被分配。右值应该在赋值的右手边,而不是左手边。 (这基本上就是lvaluervalue 中的lr 的来源。)

参见例如this values category reference 了解有关左值和右值的更多信息。

【讨论】:

    【解决方案3】:

    这是 r 和 l 值之间的差异。如果您使用 gcc 编译了第二个代码 sn-p,您会看到:

    需要左值作为赋值的左操作数

    意思是,a++ 是右值而不是左值,如果你想给它分配一些东西应该是左值

    【讨论】:

      【解决方案4】:
      int main(){
       int a = 10;
       ++a = 20; // works
       printf("a = %d", a);
       getchar();
       return 0;
      }
      

      这是一门 c 语言。 逐行解释 int main() 这一行定义了一个名为 main 的入口函数,预期返回一个整数(int)类型 int a = 10 声明一个变量整数,其值为 10; ++a = 20;此时,您的代码在对 a 执行任何操作之前将 a 的值增加 1。 这意味着,a 的值增加 1,然后将 a 赋值为 20;.... 语句 ++a = 20 是不正确的,因为 a 最初是 10 ,然后将其增加到 11 。就像说 11 = 20;这可能不会引发错误,因为代码行没有用。 printf() 是一种将文件打印到屏幕的 c 方法,传递一个字符串“a = %d”告诉编译器将 a 打印为十进制数 (%d)。 getchar() 用于终止正在运行的程序,返回 0 是强制告诉操作系统代码运行成功,返回整数值 0。

      int main(){
          int a = 10;
          a++ = 20; // error 
          printf("a = %d", a);
          getchar();
          return 0;
       }
      

      这不是在 a++ = 20 因为,正确的值递增在它递增之前执行操作,不像 ++a 在执行操作之前递增。 所以这是不可能的,它永远不会起作用,因为 a 已经是 10,你说值 ++ 并赋值 20,你不能给它赋值,它应该是计算自己的值的那个。所以编译器会想把 is 解释为变量 a++ = 20,而 ++ 不能是变量名。这就是为什么它永远不会起作用的原因。

      c中递增和递减的本质是什么......它对于创建条件语句(例如for循环,while语句等)很有用,例如:

      for(int i = 0; i < 4; i++)
      {
      printf('THis is c-language');
      }
      

      int i = 0;
      while(i < 4){
      printf('THis is c-Language');
      i++;
      }
      

      因此,根据编程规则和规定,您不能为 a++ 或 ++a 赋值 它们是供编译器操作的,所以永远不要给它们赋值。 谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-29
        • 2015-12-02
        • 2013-05-01
        • 2014-04-08
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        相关资源
        最近更新 更多