初学C语言,关于算术运算的问题。

fengwu__ 2008-07-23 09:44:59
C语言代码:
main()
{
int i=5;
int q=(++i)+(++i)+(++i);
printf("%d",q);
}
第一个问题:q是否应该等于24?
第二个问题:我使用VC++6.0编译运行,得到q=22;使用VS2005编译运行,得到q=21。为什么会得到这两个结果?
第三个问题:如果我把int q=(++i)+(++i)+(++i)改为q=i+(++i)+(++i),
仍使用VC6.0编译运行,为什么结果是19?
...全文
109 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengwu__ 2008-07-23
  • 打赏
  • 举报
回复
可能是我的问题没有说清楚。。
我想知道VC6.0是如何计算q=(++i)+(++i)+(++i)的?在内存中,是否只有一个地址存放i?如果是,那么i自增三次,然后结果应该是24。如果将(++i)看做一个函数,那么i自增后的值放在什么地方?是什么原因使程序又开辟了一块空间来存放++i的结果?还有该赋值表达式的运算顺序是怎样的?
eric_0206 2008-07-23
  • 打赏
  • 举报
回复
有意思,关注一下~!
mylinx 2008-07-23
  • 打赏
  • 举报
回复
应该是21吧就同楼上说的的一样,()()()运算级别比++高。所以应该是先计算()内部的,
在不同的系统上测试的结果不一样是因为不同的系统计算的顺序不同吧!具体的我也不是很清楚。
在进行编程的时候,尽量的不要这样写,结果正确与否,容易引起歧义。
realdragon2 2008-07-23
  • 打赏
  • 举报
回复
一般不这样写代码,这样写的结果类似于: f()+g()+h(). 三个函数相加的情形, 三个函数中先调用哪个是不确定的.
hai040 2008-07-23
  • 打赏
  • 举报
回复
不确定
考试也可以这样答
cheery_an 2008-07-23
  • 打赏
  • 举报
回复
我觉得应该是21啊,因为q=(6)+(7)+(8),括号的优先级别大于++运算符,所以绝对不是24,至于vc60得到的是22,我也想知道是为什么。
QQsoftware 2008-07-23
  • 打赏
  • 举报
回复
这种问题在不同的编译器上有不同的结果,Ansic标准是在编译器出现以后才推出的,很多编译器在设计的时候使用不同的计算方法!
realdragon2 2008-07-23
  • 打赏
  • 举报
回复
既然使用不同的编译器得出的结果不同,思维就不要拘泥于到底该以什么顺序计算,所谓,没有对错之分了,这样的题目.

btw:
Linux GCC编译器:
int q=(++i)+(++i)+(++i);
等于22,
q=i+(++i)+(++i),
等于19.


8楼的用的怎么环境?
fengwu__ 2008-07-23
  • 打赏
  • 举报
回复
C语言运算符优先级规定:括号成员第一,包括[]和()。
所以我认为应该首先计算三个(++i),然后才按照右结合的规定计算括号外的加号。
编译器没有按照C语言的规定执行?还是“(++i)”中的括号不是运算符?
[Quote=引用 7 楼 xkyx_cn 的回复:]
i只有一个地址
来分析整个语句int q=(++i)+(++i)+(++i);
语义是:定义int型变量q,并且用表达式(++i)+(++i)+(++i)来初始化它
编译器首先就得对表达式(++i)+(++i)+(++i)求值,顺序和结果都是确定的:
(1):先求第一个(++i) 将i放入寄存器,寄存器+1,寄存器结果放回i i==6
(2):再求第二个(++i) 将i放入寄存器,寄存器+1,寄存器结果放回i i==7
(3):求i+i;将i放入另外寄存器,寄存器+i的值 寄存器结果14
(4)再求第三个(++i) 将i放入…
[/Quote]
wzzyly 2008-07-23
  • 打赏
  • 举报
回复
int q=(++i)+(++i)+(++i);
等于21,
q=i+(++i)+(++i),
等于18.
xkyx_cn 2008-07-23
  • 打赏
  • 举报
回复
i只有一个地址
来分析整个语句int q=(++i)+(++i)+(++i);
语义是:定义int型变量q,并且用表达式(++i)+(++i)+(++i)来初始化它
编译器首先就得对表达式(++i)+(++i)+(++i)求值,顺序和结果都是确定的:
先求第一个(++i) 将i放入寄存器,寄存器+1,寄存器结果放回i i==6
再求第二个(++i) 将i放入寄存器,寄存器+1,寄存器结果放回i i==7
求i+i;将i放入另外寄存器,寄存器+i的值 寄存器结果14
再求第三个(++i) 将i放入寄存器,寄存器+1,寄存器结果放回i i==8
将保存上面的i+i结果的寄存器+i的值 寄存器结果22
结果赋值给q

[Quote=引用 6 楼 fengwu__ 的回复:]
可能是我的问题没有说清楚。。
我想知道VC6.0是如何计算q=(++i)+(++i)+(++i)的?在内存中,是否只有一个地址存放i?如果是,那么i自增三次,然后结果应该是24。如果将(++i)看做一个函数,那么i自增后的值放在什么地方?是什么原因使程序又开辟了一块空间来存放++i的结果?还有该赋值表达式的运算顺序是怎样的?
[/Quote]

70,024

社区成员

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

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