c语言程序设计:现代方法 第二版p44中有一段语句: i = 2; j = i*i++; 的问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言程序设计:现代方法 第二版p44中有一段语句: i = 2; j = i*i++; 的问题。相关的知识,希望对你有一定的参考价值。

c语言程序设计:现代方法 第二版p44中有一段语句:
i = 2;
j = i*i++;
这个语句真心不知道有什么毛病。书上说有可能会造成未定义的结果,但是我用很多c的编译器都试过了(gcc没试过,不知道结果),结果都是4;查阅资料后觉得奇怪,i++的自增在后缀的位置上,根据c标准不应该是等这个语句执行完毕之后的顺序点上再执行自增的吗?那语句中调用的两次i都应该是没有自增之前的
i = 2;
才对啊。
求大神指教。

别听他们胡说 书上说得对 未定义行为指 在表达式[两个顺序点之间]里面 多次修改同一个变量

用编译器得到同样的结果也说明不了什么
i*i++ 是这样的做法
那么编译器怎么实现就不好说了

原文
C语言标准明确说过:
Undefined behavior:
Between two sequence points, an object is modified more than once, or is modified and the prior value is read other than to determine the value to be stored (6.5).

译文
在序列点间
多次修改同一个对象(i=++i/++i + ++i/ i++ + ++i/...)
除当前修改的需要存储的值的以外再读取该值(i+i++/++i*i/...)
或者说在修改的同时在别的表达式中再用这个对象
是未定义的行为

i*i++
可以对应 在序列点之间 在当前修改需要存储的值以外再读取该值 后面的例子 有
i+i++
这个和你的i*i++ 雷同追问

抱歉大神。。没看到你最后那段话。。我再想想看。。

追答

我不是什么大神 上面那段译文是直接拿大神的 网址留在 参考资料 你可以去看看
i*i++
是i++是当前修改的值 然后前面的i会读取该值
怎么处理存放到寄存器 不好搞 看具体编译器实现

参考资料:http://tieba.baidu.com/p/1462740742

参考技术A 编译出来用debug步进跟踪看看,印象中应该先计算i*i,再自加,不是++i 参考技术B 先进行自增运算,即先i++;后*,所以把i=2的值先赋值给i,再进行运行j=i*i,所以结果为4,最后再对i进行加一,所以运行后i的值为3 ,如果改为j=i*++i;结果就为6,因为先自增,所以自增后i的值为3了,再j=i*i,即为2*3,最后把i的值赋值给i追问

我知道啊,我的结果就是这样的。让我疑惑的是我提到的那本教材上说这个表达式会导致未定义的结果,但是我看不出来哪儿会让编译器误解。难道是不同的编译器对这个式子的理解不同吗?但是按照c标准的话表达式里只有一个自增应该是有标准定义的啊。一开始我想是教材错了来着,但这本书被认为是现在全世界最好的c语言教材,质疑起来确实有点忌惮啊。。

追答

不同的编译器有不同的标准,但大部分编译器都是这样运行的,换了其它编译器可能会出现这种情况的……就看是什么编译器咯

输入一个数n,显示1-n之间所有的偶数的平方值C语言程序设计现代方法第二版(6.6)

一个是显示1-n内偶数和这个偶数的平方,一个是显示1-n内偶数的平方的值

输入一个数n,显示1-n之间所有的偶数的平方值

#include <stdio.h>
int main()

int a,i;
scanf("%d", &a);
for(i=1;ii<=a;i++)
if(i%2==0)
printf("%d\n",i
i);

return 0;


技术图片
技术图片

/输入一个数n,显示1-n之间所有的偶数的平方/

#include <stdio.h>
int main()

int a,i;
printf("输入一个整数");
scanf("%d", &a);
for(i=2;i<a;i++)
if(i%2==0)
printf("%d | %d\n",i, i*i);

return 0;


技术图片
技术图片

以上是关于c语言程序设计:现代方法 第二版p44中有一段语句: i = 2; j = i*i++; 的问题。的主要内容,如果未能解决你的问题,请参考以下文章

C语言程序设计现代方法第二版 8.3

逆序排列多位数(C语言程序设计现代方法第二版(6.5))

输入一个数n,显示1-n之间所有的偶数的平方值C语言程序设计现代方法第二版(6.6)

C语言程序设计:现代方法:第2版的目录

求数据结构(用面向对象方法与C++语言描述)第二版 殷人昆主编 课后答案

C语言程序设计教程答案~有追加悬赏100分!