细思极恐,一个特别容易忽视的变量内容被修改的问题。

10阅读 0评论2025-07-08 snow888
分类:C/C++

废话不多说,用一小段代码进行说明:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>

  4. int main ( void )
  5. {
  6.         int x = 0 ;
  7.         int y = 0 ;

  8.         printf("%d\n",++x);
  9.         printf("%d\n",y++);
  10.         printf("%d\n",y++);
  11.         printf("%d\n",y);

  12.         return 0;
  13. }


cc -o a a.c
我们执行 ./a 得到如下的结果。
1
0
1
2

发现问题了吗?
{BANNED}中国第一个输出: printf("%d\n",++x ); 
我们得到了逾期的结果 1 。

第二个输出:printf("%d\n",y++ );
我们也得到了逾期的结果 0 。
这是因为 y++ 是先执行了 printf("%d\n",y); 然后再执行了 y= y+1;
也就是说 y++ 是先用 y 作为基础去执行某条指令,然后再增加 1 .
 

第三个输出:printf("%d\n",y++);
我们也得到了逾期的结果 1。
理由与第二个输出一样。只是说这个时候的 y 的值实际上已经是 1 了。

第四个输出:printf("%d\n",y)
我们同样得到了逾期的结果 2。
理由同样与第二个输出一样,只是这个时候我们的第三个输出执行之后,对 y 进行了 + 1 的操作,所以在第四个输出的时候,y 的值已经是 2 了。

从这个我们会意识到一个问题,很多时候,我们希望输出 y+1 的值,但是我们不希望在下一次需要用到 y 的值的时候,y 的实际值已经发生了改变。
比如:我们希望 y 的值永远是 0 ,但是我们又希望在某个特定的时候打印 y+1 的值。很显然,使用 printf("%d\n",y++); 或者是 printf"%d\n",++y); 是不合适的。

要想满足上述效果,我们可以采取如下的方式来实现。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>

  4. int main ( void )
  5. {
  6.         int x = 0 ;
  7.         int y = 0 ;

  8.         printf("%d\n",x+1);
  9.         printf("%d\n",y);
  10.         printf("%d\n",y+1);
  11.         printf("%d\n",y);

  12.         return 0;
  13. }
这段代码执行得到的结果是:
1
0
1
0

这个得细细体会了。
上一篇:自己写的,一个完整读取 ini 文件的库 ... ...
下一篇:妈的,关于 static 被网络上的信息带偏了,还以为自己理解错误呢