一隻太平洋睡鯊 发表于 2021-12-20 21:45:57

遞增與遞減運算

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

#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-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
话说为什么要用繁体字呀
{:9_241:}

jhq999 发表于 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;// 返回被取回的值
}

傻眼貓咪 发表于 2021-12-21 14:21:07

本帖最后由 傻眼貓咪 于 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 又恢复旧值

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

一隻太平洋睡鯊 发表于 2021-12-21 21:36:54

本帖最后由 一隻太平洋睡鯊 于 2021-12-21 21:38 编辑

jhq999 发表于 2021-12-21 09:02


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

如果打x = x++
會導致"x+1(++x)"的值遺失,只保留了x的值(相當於沒有變化)
那麼y = x++的時候,
其實是
y = x ;
x += 1 ;
x+1(++x)的值就不會遺失
那麼當附值進"非自己本身的變量"時
比如
V1 = ++y
V2 = x++
的情況,那拆開來的代碼相較於附值進"自己本身"會如何變化?

一隻太平洋睡鯊 发表于 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變量?

傻眼貓咪 发表于 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)

一隻太平洋睡鯊 发表于 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兩個變量

這樣理解的話有問題嗎?

傻眼貓咪 发表于 2021-12-21 22:27:43

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

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

人造人 发表于 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;
}


傻眼貓咪 发表于 2021-12-22 10:40:55

人造人 发表于 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

人造人 发表于 2021-12-22 10:46:21

傻眼貓咪 发表于 2021-12-22 10:40
你尝试分开运行代码你就明白了:

傻眼貓咪 发表于 2021-12-22 10:52:05

人造人 发表于 2021-12-22 10:46


这么奇怪?我尝试了 gcc 8.3 确实 2 个不一样哦。
会不会是版本问题呢?还是编译器问题?

傻眼貓咪 发表于 2021-12-22 10:55:41

我网络爬文很多都说确实是 2 个不一样才是

人造人 发表于 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'的多个未排序修改
这个修改的顺序不一样,结果就不一样

人造人 发表于 2021-12-22 11:01:42

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

不同的编译器或者不同版本的同一个编译器,如果对于同一个代码给出了不同的结果
那基本上就可以认为是代码中存在未定义行为

傻眼貓咪 发表于 2021-12-22 11:03:49

你试试:#include <stdio.h>

int main(){
        int A = {0}, B = {0};
        for(int i = 0; i < 5;){
                A = i*i;
        }
       
        for(int i = 0; i < 5;){
                B[++i] = i*i;
        }
       
       
        for(int i = 0; i < 5; i++){
                printf("%d ", A);
        }
       
        printf("\n");
       
        for(int i = 0; i < 5; i++){
                printf("%d ", B);
        }
       
        return 0;
}

傻眼貓咪 发表于 2021-12-22 11:06:09

人造人 发表于 2021-12-22 11:01
不同的编译器或者不同版本的同一个编译器,如果对于同一个代码给出了不同的结果
那基本上就可以认为是代 ...

学到了{:10_250:}

人造人 发表于 2021-12-22 11:10:26

傻眼貓咪 发表于 2021-12-22 11:03
你试试:

建议在最后加一个换行


傻眼貓咪 发表于 2021-12-22 11:13:56

人造人 发表于 2021-12-22 11:10
建议在最后加一个换行

不对,我的输出结果跟你的完全不一样:1 4 9 16 25
0 1 4 9 16
页: [1] 2
查看完整版本: 遞增與遞減運算