遞增與遞減運算
附圖是書上有關於遞增遞減的介紹我看了以後,嘗試以下代碼
#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:52 编辑
x++是代码执行完之后才会加1
++x是代码执行中就会加1
所以 x = x++ ;
相当于x=100
y = ++y ;
相当于y=101;
其他同理
如果想最后都输出101
就把
x = x++
改成赋值给其他的变量eg:
a=x+1
话说为什么要用繁体字呀
{:9_241:} // 前缀形式:
int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
{//函数本身无参,意味着是在自身空间内增加1的
*this += 1;// 增加
return *this;// 取回值
}
//后缀形式:
const int int::operator++(int) //函数返回值是一个非左值型的,与前缀形式的差别所在。
{//函数带参,说明有另外的空间开辟
int oldValue = *this;// 取回值
++(*this);// 增加
return oldValue;// 返回被取回的值
}
本帖最后由 傻眼貓咪 于 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: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 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: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 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:04
原來如此,所以一開始有x(被附值)和y(未被附值)
然後執行y = x++時
實際上過程中出現3個變量(容器),x( ...
虽然有效周期很短,但也可以理解成这样吧。 傻眼貓咪 发表于 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: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:40
你尝试分开运行代码你就明白了:
人造人 发表于 2021-12-22 10:46
这么奇怪?我尝试了 gcc 8.3 确实 2 个不一样哦。
会不会是版本问题呢?还是编译器问题? 我网络爬文很多都说确实是 2 个不一样才是 傻眼貓咪 发表于 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 10:52
这么奇怪?我尝试了 gcc 8.3 确实 2 个不一样哦。
会不会是版本问题呢?还是编译器问题?
不同的编译器或者不同版本的同一个编译器,如果对于同一个代码给出了不同的结果
那基本上就可以认为是代码中存在未定义行为
你试试:#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:01
不同的编译器或者不同版本的同一个编译器,如果对于同一个代码给出了不同的结果
那基本上就可以认为是代 ...
学到了{:10_250:} 傻眼貓咪 发表于 2021-12-22 11:03
你试试:
建议在最后加一个换行
人造人 发表于 2021-12-22 11:10
建议在最后加一个换行
不对,我的输出结果跟你的完全不一样:1 4 9 16 25
0 1 4 9 16
页:
[1]
2