关于j=j++的运算问题

崔催崔! 2019-01-18 12:33:04
#include<stdio.h>
main()
{
int j=1;
j=j++;
printf("%d",j);
}
结果j为什么等于1呢?
...全文
1497 63 打赏 收藏 转发到动态 举报
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
MPLAB-IDE 2019-01-30
  • 打赏
  • 举报
回复
引用 18 楼 qq_44300926的回复:
要清楚j++和++j的区别,j++是
先用后加与先加后用的区别
flcnrcn 2019-01-27
  • 打赏
  • 举报
回复
输出的就是2吧,楼主确认代码没拷贝错?
ywxk2016 2019-01-27
  • 打赏
  • 举报
回复
结果可能和编译器有关吧,不同的编译器可能结果不一祥。
lin5161678 2019-01-25
  • 打赏
  • 举报
回复
引用 56 楼 小熊之怒 的回复:
j++ 和 ++j 是不同的。
a = j++
j首先把值赋给a,然后自增。
a = ++j
首先j自增,然后赋值给a。


先后顺序不同影响语意。这个要看,c语言的符号结合先后顺序。
无关
小熊之怒 2019-01-25
  • 打赏
  • 举报
回复
j++ 和 ++j 是不同的。
a = j++
j首先把值赋给a,然后自增。
a = ++j
首先j自增,然后赋值给a。


先后顺序不同影响语意。这个要看,c语言的符号结合先后顺序。
john_liqinghan 2019-01-25
  • 打赏
  • 举报
回复
引用 48 楼 liangxin509 的回复:
[quote=引用 47 楼 john_liqinghan 的回复:]
和编译器有关系,最好直接看汇编!不过这种就属于垃圾代码了。项目中不会有人写这样子代码的,写了也通不过审核的。

为啥这样写就算垃圾代码了呢?[/quote]

1、表意不清,
2、维护不便,
3、在开启编译器优化的时候,有些代码执行的顺序并非我们所看写的代码顺序。在于编译器优化程度以及编译器的类型,GCC和MSVC就有区别。
lin5161678 2019-01-25
  • 打赏
  • 举报
回复
引用 59 楼 weixin_41827723 的回复:
[quote=引用 58 楼 weixin_41827723的回复:]编译环境不一样结果可能不一样。

按语法规则理解,这种写法是先赋值,后加一,但你用的是同一个变量名来接收赋值和自增后的值,所以下一条语句要接收的值具体是多少就取决于编译器版本对这一点语法规则的处理方式了。[/quote]按照语法规则 这是未定义行为
你不了解语法规则
weixin_41827723 2019-01-25
  • 打赏
  • 举报
回复
引用 8 楼 liangxin509的回复:
j=j++是先赋值,再加1,没错的
问题就在于,printf已经是下一条语句了,此时赋值结束,j的值应该已经增加到2,这样理解此时应该输出2。
weixin_41827723 2019-01-25
  • 打赏
  • 举报
回复
引用 58 楼 weixin_41827723的回复:
编译环境不一样结果可能不一样。
按语法规则理解,这种写法是先赋值,后加一,但你用的是同一个变量名来接收赋值和自增后的值,所以下一条语句要接收的值具体是多少就取决于编译器版本对这一点语法规则的处理方式了。
weixin_41827723 2019-01-25
  • 打赏
  • 举报
回复
编译环境不一样结果可能不一样。
W_SLAMer 2019-01-24
  • 打赏
  • 举报
回复
++在前,++在后的问题,避免这种写法
636f6c696e 2019-01-23
  • 打赏
  • 举报
回复
大部分回答全都是错的,特别是那些强行用结果去解释的 正解是结果不可预知 在一个序列点对同个变量多次赋值的结果是不可预知的 j = ++j 是一个序列点,有两次赋值,所以结果是不可预知的,可能是1也可能是2,具体看编译器怎么生成汇编语言的
liangxin509 2019-01-22
  • 打赏
  • 举报
回复
引用 47 楼 john_liqinghan 的回复:
和编译器有关系,最好直接看汇编!不过这种就属于垃圾代码了。项目中不会有人写这样子代码的,写了也通不过审核的。

为啥这样写就算垃圾代码了呢?
john_liqinghan 2019-01-22
  • 打赏
  • 举报
回复
和编译器有关系,最好直接看汇编!不过这种就属于垃圾代码了。项目中不会有人写这样子代码的,写了也通不过审核的。
小雨滴答滴答 2019-01-22
  • 打赏
  • 举报
回复
i++ 先赋值再加一 ++i 先加一再赋值
CODING一场空 2019-01-22
  • 打赏
  • 举报
回复
引用 楼主 weixin_44566068的回复:
#include<stdio.h>
main()
{
int j=1;
j=j++;
printf("%d",j);
}
结果j为什么等于1呢?
先运算j啊,然后再算++,如果是j=++j的话,输出就是2了
qq_44226963 2019-01-22
  • 打赏
  • 举报
回复
j=j++(先赋值然后自增)
  • 打赏
  • 举报
回复
j++是自身赋值然后在进行+1。++j是自身+1后然后在进行赋值。j--和--j同理
spenan 2019-01-22
  • 打赏
  • 举报
回复
j++ 表示 先把原来的值先赋值给j 然后在自增 ++j就表示原值先加1 赋值给j 通俗就是一个是先赋值在加一 一个是先加一再赋值
LandY和C 2019-01-22
  • 打赏
  • 举报
回复
# include <stdio.h>

int main(void)
{
int j = 1 ;

j = j++ ;
printf("%d\n" , j);

return 0 ;
}

————————————
执行结果:

2
Press any key to continue
————————————

兄弟你什么编译器。
加载更多回复(43)

69,369

社区成员

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

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