a++和++a的值问题

huangzhtao 2011-08-15 11:16:58
如下代码:

#include <stdio.h>

#define F1(a) (++(a))*(++(a))
#define F2(a) ((a)++)*(++(a))
#define F3(a) (++(a))*((a)++)
#define F4(a) ((a)++)*((a)++)

int main(int argc, char* argv[])
{
int nB=5;
printf("Result 1:%d\n",F1(nB));
nB=5;
printf("Result 2:%d\n",F2(nB));
nB=5;
printf("Result 3:%d\n",F3(nB));
nB=5;
printf("Result 4:%d\n",F4(nB));
getchar();
return 0;
}

请问输出结果是多少,为什么?
...全文
375 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZXH 2011-08-16
  • 打赏
  • 举报
回复
++a;前自增,在执行这句之前a=a+1
a++:后自增,在执行这句之后才会a=a+1
#include<stdio.h>
int main(void)
{
int a=1;
int b=1;
printf("a=%d,b=%d\n",++a,b++);
printf("a=%d,b=%d\n",a,b);
return 0;
}

用这个就可以下看出它们的不同了
暮雨晨舟 2011-08-16
  • 打赏
  • 举报
回复
现在好多公司的笔试都喜欢考这种类型的题目,真不知道有啥意义
吾子墨鸿 2011-08-16
  • 打赏
  • 举报
回复
++的运算与编译器和机器有关,所以嘛答案的没有。。。。
tanny_mulanyue 2011-08-16
  • 打赏
  • 举报
回复
对于这样的问题,确实没什么意义。它的出现,也就是为了让初学者理解运算符优先级的对运算结果的影响。实际应用时,我们不会写出这样可读性如此差的表达式。
奔跑的杏鲍菇 2011-08-16
  • 打赏
  • 举报
回复
毫无意义,知道原理就行了
QQ346957135 2011-08-15
  • 打赏
  • 举报
回复
运行结果:
Result 1:49
Result 2:36
Result 3:36
Result 4:25
先搞清各符号的优先级,书上都有的。
第一个:顺序为a先自加,a再自加,这是a为7,然后a*a=49
第二个:第一个括号内a是后加,所以先不管,第二个括号内a是前加,所以a++,a=6,再a*a
第三个:第一个括号内自加,后面那个不管,a=6
第四个:两个a都是后+,所以先算乘法,这时a是初值5
5t4rk 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 rendao0563 的回复:]

月经贴 鉴定完毕
[/Quote]

呵呵呵
++
至善者善之敌 2011-08-15
  • 打赏
  • 举报
回复
月经贴?
Jxiaoshen 2011-08-15
  • 打赏
  • 举报
回复
楼上的说的很详细了 楼主知道a++ 和++a的区别就可以了
xinhua0910 2011-08-15
  • 打赏
  • 举报
回复
肯定又是被一些破人搞的笔试题整的
代码随想录 2011-08-15
  • 打赏
  • 举报
回复
分别是6的6次方,5的6次方,6的5次方,5的5次方,++a是让先加1在运算,a++是先运算再加一
赵4老师 2011-08-15
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

不要写连自己也预测不了结果的代码!

编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。
rendao0563 2011-08-15
  • 打赏
  • 举报
回复
月经贴 鉴定完毕
机智的呆呆 2011-08-15
  • 打赏
  • 举报
回复
简单的说,c/c++一个表达式中一个变量被读取了两次同时又被改写了,那么这个表达式的求值结果跟编译器相关了。实际中无论如何也不能出现类似的代码,这样的代码的唯一作用可以认为是用来考c++序列点和副作用知识点的。珍惜生命,不要继续耗在类似的问题上浪费时间了。
机智的呆呆 2011-08-15
  • 打赏
  • 举报
回复
unspecified behavior,跟编译器实现相关。
百度
序列点
副作用
坏男孩 2011-08-15
  • 打赏
  • 举报
回复
没有去算你只要记住一点就行
int a=3;
int b = ++a; //此时b的值为4 a的值也为4
如果是下面这样
int b = a++; //此时b的值为3 ,而a 的值完成运算之后+1成为了 4
quwei197874 2011-08-15
  • 打赏
  • 举报
回复
运行一下不就知道了
xiaoguangzaia 2011-08-15
  • 打赏
  • 举报
回复
不同编译器答案不同,没必要纠结

可以搜下顺序点
jernymy 2011-08-15
  • 打赏
  • 举报
回复
不同的编译器输出会可能不同
huangzhtao 2011-08-15
  • 打赏
  • 举报
回复
原来如此 学习了
今天还讨论了半天是怎么回事呢
加载更多回复(11)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧