鱼C论坛

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

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

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

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

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

x
附圖是書上有關於遞增遞減的介紹
我看了以後,嘗試以下代碼
#include <stdio.h>

int main()
{
        int x, y, z, w ; 
        
        x = 100 ; 
        y = 100 ;
        z = 100 ;
        w = 100 ;
        
        x = x++ ;
        y = ++y ;
        
        z = z-- ;
        w = --w ;
        
        printf("%d\n", x ) ; 
        printf("%d\n", y ) ; 
        
        printf("%d\n", z ) ; 
        printf("%d\n", w ) ; 
        
        return 0 ; 
}

輸出結果
100
101
100
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 共同学习

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

x++是代码执行完之后才会加1
++x是代码执行中就会加1
所以
 x = x++ ;
相当于x=100
 y = ++y ;

相当于y=101;
其他同理
如果想最后都输出101
就把
 x = x++

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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



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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

int main(){
        int x = 13;
        x = x++;
        printf("%d", x); // 打印 13(没有变)
}

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

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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++
的情況,那拆開來的代碼相較於附值進"自己本身"會如何變化?
想知道小甲鱼最近在做啥?请访问 -> 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變量?
想知道小甲鱼最近在做啥?请访问 -> 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 感謝回覆!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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兩個變量

這樣理解的話有問題嗎?
想知道小甲鱼最近在做啥?请访问 -> 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.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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
#include <stdio.h>

int main(void) {
        int x = 0;
        x = ++x;
        x = x++;
        printf("%d\n", x);
        return 0;
}

Untitled.png

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

int main(){
        int x = 13;
        x = ++x;
        printf("%d", x);
        
        printf("\n");
        
        int y = 13;
        y = y++;
        printf("%d", y);
        return 0;
}
14
13
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

Untitled.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这么奇怪?我尝试了 gcc 8.3 确实 2 个不一样哦。
会不会是版本问题呢?还是编译器问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 10:55:41 From FishC Mobile | 显示全部楼层
我网络爬文很多都说确实是 2 个不一样才是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

在同一条语句中对同一个变量执行了两次赋值操作
就是这样的代码行为是未定义的
不同的实现很有可能会给出不同的结果,当然也可以给出相同的结果
我这边的gcc和clang就给出了一样的结果
对'x'的多个未排序修改
这个修改的顺序不一样,结果就不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不同的编译器或者不同版本的同一个编译器,如果对于同一个代码给出了不同的结果
那基本上就可以认为是代码中存在未定义行为
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int main(){
        int A[5] = {0}, B[5] = {0};
        for(int i = 0; i < 5;){
                A[i++] = i*i;
        }
        
        for(int i = 0; i < 5;){
                B[++i] = i*i;
        }
        
        
        for(int i = 0; i < 5; i++){
                printf("%d ", A[i]);
        }
        
        printf("\n");
        
        for(int i = 0; i < 5; i++){
                printf("%d ", B[i]);
        }
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

学到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

建议在最后加一个换行

Untitled.png
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不对,我的输出结果跟你的完全不一样:
1 4 9 16 25 
0 1 4 9 16 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-27 02:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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