烦请哪位高手能详细解释下C语言中的一个格式:a++*2 (a是变量),谢谢! C语言中,求a++ + ++a + a++ + ++a的值,...

作者&投稿:兴研 (若有异议请与网页底部的电邮联系)
++x的值是(增量之后的)新值,结果是一个左值x,例如,y=++x等价于y=(x+=1);
参考一下VC6的汇编代码:
x在内存单元ebp-4,y在内存单元ebp-8
y=++x VC6下的汇编代码为:
mov edx,dword ptr [ebp-4]
add edx,1
mov dword ptr [ebp-4],edx
mov eax,dword ptr [ebp-4]
mov dword ptr [ebp-8],eax

x++的值则是x原有的值,结果是一个右值,临时变量,例如,y=x++等价于y=(t=x,x+=1,t);
y=x++ VC6下的汇编代码为:
mov eax,dword ptr [ebp-4]
mov dword ptr [ebp-8],eax
mov ecx,dword ptr [ebp-4]
add ecx,1
mov dword ptr [ebp-4],ecx

也就是说a++*2 等价于(t=a,a+=1,t)*2,先取a的值在表达式里用,然后再给a+1。也可以写成这样a*2,a++;

如果a=2,表达式结果是4,a的值是3

结果就是 a*2, 附带效果是a自加1

正解,,
乘法优先

自己在VC上跑一下,不同的环境貌似出来的结果是不一样的

a++*2=a*2
然后a=a+1

下面C语言中a++*2表示的是什么意思,以及这个程序的详细运算步骤,O(∩_∩)O谢谢~

看了下下面的,看来我没讲清楚
这是优先集的问题。
++的优先集比*高。所以先做++

a++*2就是a++然后*2
因为a++的含义是先做运算,等运算完再对a加1.
所以效果是a*2后,然后加上1.

可是如果是++a*2呢???
当然也是先++,
所以就是先++a,然后*2.
这才是我想表达的优先集问题

main()
{
int a=0,n;//声明变量
scanf("%d",&n);//输入一个数字并存储
while (n--)//当n--!=0的时候执行循环。n--=0为假,跳出循环,n--的意思也是执行完表达式后,才对n-1.

printf("%d",a++*2);//上面讲过啦
getch();//停下程序
}

10 + 12 + 12 + 14 = 48
我也写了下,确实是45。下面是编译产生的汇编代码:

movl $10, -12(%ebp) ; -12(%ebp) indicate a here.
17 addl $1, -12(%ebp)
18 movl -12(%ebp), %eax
19 addl -12(%ebp), %eax
20 addl -12(%ebp), %eax
21 addl $1, -12(%ebp)
22 addl -12(%ebp), %eax
23 movl %eax, -8(%ebp)
24 addl $1, -12(%ebp)
25 addl $1, -12(%ebp)

eax 和 ebp-12 的变化过程如下
eax ebp-12
NIL 10
11 10+1
22 11
33 11+1
45 12
45 13
45 14
可以看到,初始的时候用11加了三次,最后一次加的是12
所以得到45。是编译器优化的结果。

所以,最后a是14,和为45
上面的人们,别那么武断的下结论。因为错误就往往出现在武断中。
楼主的表达式是下面这个意思:
(a++)+(++a)+(a++)+(++a)。依旧是45

C语言:哪位高手能解释一下下面这个程序,尽可能一步一步详细解说,解释的...
答:include "stdafx.h" /*C语言头文件,表示下面的程序要引用某一个C编译器自带的函数*/ int age(int n) /*定义返回值为整形,输入值为整形n的函数*/ { int c; /* 定义整数c*/ if(n==1) /* ==是逻辑等的判断*/ c=2; /*如果输入的n等于1则执行c=2*/ else c=age(n-1...

C语言,,请详细解释,详细
答:2016-01-09 C语言:这道题请详细解释一下~ (定义字符指针d,可是它没有... 3 2009-10-29 C语言基本代码,求详细解释,越详细越好。 423 2015-06-21 c语言编程\n是把什么换行,是什么意思,请详细解释。 78 2015-06-08 c语言每行的意思,请解释的详细一点 2013-05-13 C语言中%8.1f ,8.1是什么意...

哪位高手能我解释一下,关于C语言的自加和自减,越详细越好。
答:这也是为什么在循环中,如果有自增运算,我们更提倡使用前自增。不过这一点现在已经很少被提到了,一方面由于现代计算机的性能不断提升,多数情况下已经不需要考虑之二者这一点点差别了;另一方面,某些现代智能型的编译器,会在编译时自动替你完成这个优化工作的。

解释C语言
答:将函数的定义包含到程序中是有编译器完成的 define CUBE(x)(x*x*x)这是C语言中的宏定义,宏分为简单的宏和带参数的宏,宏有什么作用?宏的一般格式是”#define 记号 替换列表“其中 define是“定义”的意思,也算是固定格式吧,记号可以是字母,符号等一切可能出现的东西,比如说#define CUBE(x)...

C语言问题,,,求高手解答下,,,这个每一步各是什么意思?
答:{ int s,t,A=10; //声明整型变量,其中 A赋值为10 double B; //double变量B s=sizeof(A); //得到整型变量A的占用字节数 4,赋值给s t=sizeof(B); //得到double变量B所占字节数 8,赋值给t printf("%d,%d\n",s,t); //输出结果 4,8} ...

两道C语言看程序谢结果题不会,哪位高手能帮忙解释一下,直接给答案就算...
答:第一题:输出结果:04321 执行过程:从 main() 函数开始执行,执行到 f(12340),进入函数 f(int x) 中,此时参数 x 的值为12340 不等于 0 ,进入 if (x) 语句,执行 putchar (x % 10 + '0'),此时,x % 10 的值为 0 , 0 + '0' 为 '0' (因为字符 '0' ~'9' 的 ASCII ...

C语言 15题解释一下
答:在c语言中,数据溢出不报错、不报警、不抛异常,而是直接截断。short数据类型仅有2个字节,所以向其赋值0xabcde时,仅能容纳低位的两个字节0xbcde,儿高位的0xa0000,被截断后直接丢弃了。

麻烦哪位高手解释一下这个C语言程序中,那个word 有什么用?
答:Word==0表示输入的字符为空,Word!=0表示输入了有效字符。程序统计的是用户连续输入的非空词的个数,直到用户只输入一个回车符时退出

请C语言高手帮忙看一下
答:&函数名:就是取函数的地址。但不是必须的,事实函数名本身就是指针。&函数名=函数名 都是取函数地址,可以用函数指针接收。但两者大小不一样。前者4字节,后者1字节。如果用指针接收后,调用也有2种方式:(*指针名)(); 指针名(); 这两种都可以。但个人偏向第一种,因为符合指针的理解...

求C语言高手深刻解释一下这个问题
答:printf("%d\n%d\n",a,&a); //为什么 a = &a ?? 我记得教科书上有清楚的介绍。 a=&a是C语言设计的规定!a是数组名,a就表示数组的首地址,&a是取a的地址,在数值上两个是相同的,但意义不同!a是数组首地址,也是a[0]的地址,a=&a[0],这两个意义是相同的!都表示一个“...