C语言的前置和后置运算符的区别?!20
发布网友
发布时间:2023-09-12 08:16
我来回答
共4个回答
热心网友
时间:2024-11-30 13:40
C语言的前置和后置运算符的区别为:执行顺序不同、当前值不同、侧重点不同。
一、执行顺序不同
1、前置运算符:前置运算符的执行顺序为先取变量的地址,运算它的内容,然后把值放到寄存器中。
2、后置运算符:后置运算符的执行顺序为先取变量的地址,把它的值装入寄存器中,在运算它内存中的内容。
二、当前值不同
1、前置运算符:前置运算符的当前值为变量值经过运算它后的内容。
2、后置运算符:后置运算符的当前值为变量值的内容。
三、侧重点不同
1、前置运算符:前置运算符的侧重点为先算后用。
2、后置运算符:后置运算符的侧重点为先用后算。
热心网友
时间:2024-11-30 13:40
前置运算符与后置运算符的区别主要在于执行顺序上。
下面通过举例来具体说明两者之间的区别:
int i=0;
if(i++>0) // 后置运算符
printf("HelloWorld");
// 程序执行完后,i的值变为1,但是不会输出HelloWorld,因为是后置运算符,所以上面的程序等价于下面的程序段:
int i=0;
if(i>0) // 由于i=0,因此不执行{}中的语句
{
i=i+1;
printf("HelloWorld");
}
int i=0;
if(++i>0) // 前置运算符
printf("HelloWorld");
// 程序执行完后,i的值变为1,而且输出HelloWorld。该程序段等价于如下程序段:
int i=0;
i = i + 1;
if(i>0) // 由于i=1,所以会执行printf语句
printf("HelloWorld");
热心网友
时间:2024-11-30 13:41
看完也许对你有帮助
我的计算机编译这两个程序的汇编代码
程序1:#include <stdio.h>
void main(){
int x=10;
printf("%d,%d\n",--x,--x);
}
代码1:int x=10;
0040D728 mov dword ptr [ebp-4],0Ah
4: printf("%d,%d\n",--x,--x);
0040D72F mov eax,dword ptr [ebp-4]
0040D732 sub eax,1//注意这儿
0040D735 mov dword ptr [ebp-4],eax
0040D738 mov ecx,dword ptr [ebp-4]
0040D73B push ecx//这儿 压栈
0040D73C mov edx,dword ptr [ebp-4]
0040D73F sub edx,1 //这儿
0040D742 mov dword ptr [ebp-4],edx
0040D745 mov eax,dword ptr [ebp-4]
0040D748 push eax//这儿
0040D749 push offset string "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n" (00422fa4)//字符确定
0040D74E call printf (00401080)//调输出
输出结果:8,9
程序2:#include <stdio.h>
void main(){
int x=10;
printf("%d,%d\n",x--,--x);
}
代码2:int x=10;
0040D728 mov dword ptr [ebp-4],0Ah
4: printf("%d,%d\n",x--,--x);
0040D72F mov eax,dword ptr [ebp-4]
0040D732 sub eax,1//这儿
0040D735 mov dword ptr [ebp-4],eax
0040D738 mov ecx,dword ptr [ebp-4]
0040D73B push ecx//压
0040D73C mov edx,dword ptr [ebp-4]
0040D73F mov dword ptr [ebp-8],edx
0040D742 mov eax,dword ptr [ebp-8]
0040D745 push eax//这儿 并没有先自减
0040D746 push offset string "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n" (00422fa4)//字符确定
0040D74B mov ecx,dword ptr [ebp-4]
0040D74E sub ecx,1//这儿才减
0040D751 mov dword ptr [ebp-4],ecx
0040D754 call printf (00401080)//打印
输出结果 9,9
再看你这道题 经过上面分析程序执行完后 x=0;
printf是从右往左的执行代码的
所以先压x-- x-- x--3个10然后--x=9 --x=8 --x=7 --x=6 --x=5 --x=4 x--=4
输出有个出栈 所以从后压栈的先输出
现在知道 如果第一个改为--x 必定第一个输出为3 后面不变
明白了没?
热心网友
时间:2024-11-30 13:41
有的printf是从右向左读取,有的是从左向右,你的这个例子不好,
至于前置和后置(以+说明):前置为在X的地址已经+1了然后看看有没有要和其他的数据运算的;而后置是在一个临时地址+1,用地址中没+1的值先去看看是否有和其他的数据运算,运算后X地址中的值才接收临时地址的+1值