鱼C论坛

 找回密码
 立即注册
查看: 2177|回复: 25

[已解决]遞增與遞減運算

[复制链接]
发表于 2021-12-20 21:45:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
附圖是書上有關於遞增遞減的介紹
我看了以後,嘗試以下代碼

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int x, y, z, w ;
  5.        
  6.         x = 100 ;
  7.         y = 100 ;
  8.         z = 100 ;
  9.         w = 100 ;
  10.        
  11.         x = x++ ;
  12.         y = ++y ;
  13.        
  14.         z = z-- ;
  15.         w = --w ;
  16.        
  17.         printf("%d\n", x ) ;
  18.         printf("%d\n", y ) ;
  19.        
  20.         printf("%d\n", z ) ;
  21.         printf("%d\n", w ) ;
  22.        
  23.         return 0 ;
  24. }
复制代码


輸出結果
  1. 100
  2. 101
  3. 100
  4. 99
复制代码


想請問如果按照書上的敘述
雖然x的值先被指定給自己(x),但之後不是又加1了嗎?
為啥會維持100的值?
z值同問

凡是針對問題回覆者皆先得3以上魚幣,感謝^^
最佳答案
2021-12-21 21:52:30
一隻太平洋睡鯊 发表于 2021-12-21 21:45
如果 x = x++ 是
x(new) = x(old)+1
x(new) = x(old)

如果 x = x++ 是
x(new) = x(old)+1
x(new) = x(old)
*x 恢复旧值

范例:y = x++
x(new) = x(old)+1
y = x(old)
266770409_460892262039785_2220679223042470896_n.jpg

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
小伤口 + 5 + 5 共同学习

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-12-20 23:49:31 | 显示全部楼层
本帖最后由 小伤口 于 2021-12-20 23:52 编辑

x++是代码执行完之后才会加1
++x是代码执行中就会加1
所以
  1. x = x++ ;
复制代码

相当于x=100
  1. y = ++y ;
复制代码

相当于y=101;
其他同理
如果想最后都输出101
就把
  1. x = x++
复制代码

改成赋值给其他的变量eg:
a=x+1
话说为什么要用繁体字呀

评分

参与人数 1荣誉 +5 鱼币 +3 贡献 +3 收起 理由
一隻太平洋睡鯊 + 5 + 3 + 3 感謝回覆!因為是灣家人~

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-21 09:02:55 | 显示全部楼层
  1. // 前缀形式:
  2. int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
  3. {//函数本身无参,意味着是在自身空间内增加1的
  4.   *this += 1;  // 增加
  5.   return *this;  // 取回值
  6. }



  7. //后缀形式:
  8. const int int::operator++(int) //函数返回值是一个非左值型的,与前缀形式的差别所在。
  9. {//函数带参,说明有另外的空间开辟
  10.   int oldValue = *this;  // 取回值
  11.   ++(*this);  // 增加
  12.   return oldValue;  // 返回被取回的值
  13. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
一隻太平洋睡鯊 + 5 + 5 + 3 感謝回覆!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-12-21 14:21:07 From FishC Mobile | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-12-21 14:27 编辑

我明白楼主的意思了,楼主知道什么是 ++x 什么是 x++
唯一不解的是:
  1. #include <stdio.h>

  2. int main(){
  3.         int x = 13;
  4.         x = x++;
  5.         printf("%d", x); // 打印 13(没有变)
  6. }
复制代码

其实 x = x++ 执行两个代码
为了方便你理解,我特别注明 new 和 old
x(new) = x(old)+1
x(new) = x(old)
*x 又恢复旧值

你必须知道什么是变量,变量其实就是容器,并不是值本身,它只负责储存值

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
一隻太平洋睡鯊 + 5 + 5 + 3 感謝回覆!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-12-21 21:36:54 | 显示全部楼层
本帖最后由 一隻太平洋睡鯊 于 2021-12-21 21:38 编辑


所以在下面的代碼裡面
第14行的"++(*this);"的值就相當於遺失了嗎?
那"++(*this);"這串代碼豈不是並無意義(沒有被附值進入任何變量)
這樣沒有意義的代碼不會導致報錯嗎?

如果打x = x++
會導致"x+1(++x)"的值遺失,只保留了x的值(相當於沒有變化)
那麼y = x++的時候,
其實是
y = x ;
x += 1 ;
x+1(++x)的值就不會遺失
那麼當附值進"非自己本身的變量"時
比如
V1 = ++y
V2 = x++
的情況,那拆開來的代碼相較於附值進"自己本身"會如何變化?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-21 21:45:30 | 显示全部楼层
傻眼貓咪 发表于 2021-12-21 14:21
我明白楼主的意思了,楼主知道什么是 ++x 什么是 x++
唯一不解的是:
其实 x = x++ 执行两个代码

如果 x = x++ 是
x(new) = x(old)+1
x(new) = x(old)
*x 恢复旧值

那麼 y = x++ 不就是反過來
y = x
x = x+1

不然
x = x+1
y = x
y不就會變成x+1?
為什麼會出現這樣的情況?
還是說其實在執行 y = x++ 的時候是
x(new) = x(old)+1
y = x(old)
變成裡面有新舊兩個不同的x變量?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-21 21:52:30 | 显示全部楼层    本楼为最佳答案   
一隻太平洋睡鯊 发表于 2021-12-21 21:45
如果 x = x++ 是
x(new) = x(old)+1
x(new) = x(old)

如果 x = x++ 是
x(new) = x(old)+1
x(new) = x(old)
*x 恢复旧值

范例:y = x++
x(new) = x(old)+1
y = x(old)

评分

参与人数 1荣誉 +5 鱼币 +3 贡献 +3 收起 理由
一隻太平洋睡鯊 + 5 + 3 + 3 感謝回覆!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-12-21 22:04:28 | 显示全部楼层
傻眼貓咪 发表于 2021-12-21 21:52
如果 x = x++ 是
x(new) = x(old)+1
x(new) = x(old)

原來如此,所以一開始有x(被附值)和y(未被附值)
然後執行y = x++時
實際上過程中出現3個變量(容器),x(new), x(old), y
執行完以後x被附值x(new)
y被附值x(old)
又回到x和y兩個變量

這樣理解的話有問題嗎?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-21 22:27:43 | 显示全部楼层
一隻太平洋睡鯊 发表于 2021-12-21 22:04
原來如此,所以一開始有x(被附值)和y(未被附值)
然後執行y = x++時
實際上過程中出現3個變量(容器),x( ...

虽然有效周期很短,但也可以理解成这样吧。

评分

参与人数 1荣誉 +4 鱼币 +5 贡献 +3 收起 理由
一隻太平洋睡鯊 + 4 + 5 + 3 感謝解答!(下面的討論完全超過我的程度了X.

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-12-22 10:11:14 | 显示全部楼层
傻眼貓咪 发表于 2021-12-21 21:52
如果 x = x++ 是
x(new) = x(old)+1
x(new) = x(old)

这代码行为是未定义的,我试了gcc和clang,这两个给出的结果都是1
我又安装了一个vc6,试了一下,vc6给出的结果是2

  1. #include <stdio.h>

  2. int main(void) {
  3.         int x = 0;
  4.         x = ++x;
  5.         x = x++;
  6.         printf("%d\n", x);
  7.         return 0;
  8. }
复制代码


Untitled.png

评分

参与人数 1鱼币 +3 贡献 +3 收起 理由
一隻太平洋睡鯊 + 3 + 3 我5樓也思考這問題,目前對我來說超過程度.

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 10:40:55 From FishC Mobile | 显示全部楼层
人造人 发表于 2021-12-22 10:11
这代码行为是未定义的,我试了gcc和clang,这两个给出的结果都是1
我又安装了一个vc6,试了一下,vc6给 ...

你尝试分开运行代码你就明白了:
  1. #include <stdio.h>

  2. int main(){
  3.         int x = 13;
  4.         x = ++x;
  5.         printf("%d", x);
  6.        
  7.         printf("\n");
  8.        
  9.         int y = 13;
  10.         y = y++;
  11.         printf("%d", y);
  12.         return 0;
  13. }
复制代码
  1. 14
  2. 13
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 10:46:21 | 显示全部楼层
傻眼貓咪 发表于 2021-12-22 10:40
你尝试分开运行代码你就明白了:

Untitled.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 10:52:05 From FishC Mobile | 显示全部楼层
人造人 发表于 2021-12-22 10:46

这么奇怪?我尝试了 gcc 8.3 确实 2 个不一样哦。
会不会是版本问题呢?还是编译器问题?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 10:55:41 From FishC Mobile | 显示全部楼层
我网络爬文很多都说确实是 2 个不一样才是
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 10:58:55 | 显示全部楼层
傻眼貓咪 发表于 2021-12-22 10:52
这么奇怪?我尝试了 gcc 8.3 确实 2 个不一样哦。
会不会是版本问题呢?还是编译器问题?
  1. main.c:5:13: warning: multiple unsequenced modifications to 'x' [-Wunsequenced]
复制代码


在同一条语句中对同一个变量执行了两次赋值操作
就是这样的代码行为是未定义的
不同的实现很有可能会给出不同的结果,当然也可以给出相同的结果
我这边的gcc和clang就给出了一样的结果

  1. 对'x'的多个未排序修改
复制代码

这个修改的顺序不一样,结果就不一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 11:01:42 | 显示全部楼层
傻眼貓咪 发表于 2021-12-22 10:52
这么奇怪?我尝试了 gcc 8.3 确实 2 个不一样哦。
会不会是版本问题呢?还是编译器问题?

不同的编译器或者不同版本的同一个编译器,如果对于同一个代码给出了不同的结果
那基本上就可以认为是代码中存在未定义行为
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 11:03:49 From FishC Mobile | 显示全部楼层
你试试:
  1. #include <stdio.h>

  2. int main(){
  3.         int A[5] = {0}, B[5] = {0};
  4.         for(int i = 0; i < 5;){
  5.                 A[i++] = i*i;
  6.         }
  7.        
  8.         for(int i = 0; i < 5;){
  9.                 B[++i] = i*i;
  10.         }
  11.        
  12.        
  13.         for(int i = 0; i < 5; i++){
  14.                 printf("%d ", A[i]);
  15.         }
  16.        
  17.         printf("\n");
  18.        
  19.         for(int i = 0; i < 5; i++){
  20.                 printf("%d ", B[i]);
  21.         }
  22.        
  23.         return 0;
  24. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 11:06:09 From FishC Mobile | 显示全部楼层
人造人 发表于 2021-12-22 11:01
不同的编译器或者不同版本的同一个编译器,如果对于同一个代码给出了不同的结果
那基本上就可以认为是代 ...

学到了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 11:10:26 | 显示全部楼层

建议在最后加一个换行

Untitled.png
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 11:13:56 From FishC Mobile | 显示全部楼层
人造人 发表于 2021-12-22 11:10
建议在最后加一个换行

不对,我的输出结果跟你的完全不一样:
  1. 1 4 9 16 25
  2. 0 1 4 9 16
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 02:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表