关于谭浩强的c程序设计第四版书上的问题
谭浩强先生的c程序设计第四版说对于例如printf("%d%d%d",i,i++,i++);这种语句的,是在执行完printf语句后再使i加1的,而不是在求出最右边一项的...
谭浩强先生的c程序设计第四版说对于例如printf("%d%d%d", i, i++, i++);这种语句的 ,是在执行完printf语句后再使i加1的,而不是在求出最右边一项的值之后i的值立即加1,,但是turbo c运行结果不是这样的,就是求出右边一项后立即加1,请问是不是谭浩强先生的书出错了??
展开
3个回答
展开全部
这跟编译器也有关系。
一般情况下,编译器有的从左向右编译,有的从右向左编译。从你的显示结果看,tc是从右向左编译:i,i++,i++ 实际上是三个语句。当i=1时,先执行最右边的i++,结果显示为1,而此时i值为2;
再执行中间的i++,显示为2,此时i值为3,最后执行i,显示为3。这是tc的执行顺序。
vc的编译情况和tc不同,因为vc是面向对象的c++语言用的,不是单纯的c语言。
实际上这是编译器内部的管理问题,只是说明问题,谁也不会用i,i++,i++这样容易混淆的表达。
明白了吗?
等你学了编译原理即明白了。
表达式在编译过程中有顺序,并且跟编译器编译工程紧密相关。tc是在编译的过程中把i,i++,i++的结果已经计算出来后再存储到临时变量里的。
我现在没有c编译器,只能从java里面相似地跟你说面问题:
a:
int i =1;
System.out.println((i++)+(i++)+i);
结果:6
b:
int i =1;
System.out.println(i+(i++)+i++);
结果:4
说明java的编译器是从左向右编译。a 中i++值为1,此时i为2;i++值为2,此时i值为3,即:((i++)+(i++)+i值为6
b 中 i为1,i++值为1,此时i值为2,i++值为2,此时i值为3 ,即:i+(i++)+i++ 值为4
注意 i++ 的值和i值是不同的概念。i++是表达式的值,为i值。即i++值比i值小1
同样++i值则和i值一样。
一般情况下,编译器有的从左向右编译,有的从右向左编译。从你的显示结果看,tc是从右向左编译:i,i++,i++ 实际上是三个语句。当i=1时,先执行最右边的i++,结果显示为1,而此时i值为2;
再执行中间的i++,显示为2,此时i值为3,最后执行i,显示为3。这是tc的执行顺序。
vc的编译情况和tc不同,因为vc是面向对象的c++语言用的,不是单纯的c语言。
实际上这是编译器内部的管理问题,只是说明问题,谁也不会用i,i++,i++这样容易混淆的表达。
明白了吗?
等你学了编译原理即明白了。
表达式在编译过程中有顺序,并且跟编译器编译工程紧密相关。tc是在编译的过程中把i,i++,i++的结果已经计算出来后再存储到临时变量里的。
我现在没有c编译器,只能从java里面相似地跟你说面问题:
a:
int i =1;
System.out.println((i++)+(i++)+i);
结果:6
b:
int i =1;
System.out.println(i+(i++)+i++);
结果:4
说明java的编译器是从左向右编译。a 中i++值为1,此时i为2;i++值为2,此时i值为3,即:((i++)+(i++)+i值为6
b 中 i为1,i++值为1,此时i值为2,i++值为2,此时i值为3 ,即:i+(i++)+i++ 值为4
注意 i++ 的值和i值是不同的概念。i++是表达式的值,为i值。即i++值比i值小1
同样++i值则和i值一样。
来自:求助得到的回答
展开全部
i=1
应该还是1,1,1
自加运算应该是在这条语句之后执行
如果再次输出i,应该是3
应该还是1,1,1
自加运算应该是在这条语句之后执行
如果再次输出i,应该是3
追问
假如i为1,turbo c输出是3 2 1,但我用vc运行结果是1 1 1,这是怎么回事???
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
假设i=1;
结果不是:1 1 2 吗?
结果不是:1 1 2 吗?
追问
turbo c是3 2 1,vc是 1 1 1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询