简单的C问题 ++ && 优先级

joly_zl 2009-02-18 08:32:52
[del]#include <iostream>
using namespace std;

int main()
{
int i=1;
int j=i++;
if(i>j++&&i++==j)
i+=j;

return 0;
}

//为什么i=5;
...全文
231 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shuni 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wuyanchao 的回复:]
i=5,正确
原因:
int j=i++;//i=2,j=1

if(i>j++&&i++==j)

//按照短路原则,逻辑与和逻辑或先计算左值,j是后自增,先计算,后返回+1的值,i=2大于j=1,左值为真,则计算右
//值,完事i=2,j=2

//同理,i后自增,i=2等于j=2,右值为真,完事i=3,j=2

i+=j;故i=5,j=3


一个表达式里,不要在两个或更多的子表达式中对同一个对象做自增操作,容易把自己绕进去
[/Quote]
支持
opengl3d 2009-02-19
  • 打赏
  • 举报
回复
那就别去这家公司了
neeestth 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zqz981 的回复:]
line 1.  i =1
line 2.  j = 1 ==> i变为2
line 3  i =2 > j =1  成立, j++ 变为2, i=2 == j==2 , i++ i变为3
i+=j ==> i=3, j=2  所以 i+j =5
[/Quote]
就是这样
我看你有戏 2009-02-19
  • 打赏
  • 举报
回复
++ 优先级 高于 &&的原因

if((i>j++)&&(i++==j))

加括号i 还是 5
ysysbaobei 2009-02-19
  • 打赏
  • 举报
回复
顶,mark
thinkboy234 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 joly_zl 的帖子:]
C/C++ code[del]#include <iostream>
using namespace std;
int main()
{
int i=1;
int j=i++; //第一步先把i的值赋给j,j=1.执行i++,i=2
if(i>j++&&i++==j) //第二步首先执行j++,j=2.然后执行i++,i=3
i+=j; //if判断条件成立。所以i=i+j=2+3=5
return 0;
}
//为什么i=5;
[/Quote]
ypb362148418 2009-02-19
  • 打赏
  • 举报
回复
++运算级高于&&
matrix_chen 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zqz981 的回复:]
line 1. i =1
line 2. j = 1 ==> i变为2
line 3 i =2 > j =1 成立, j++ 变为2, i=2 == j==2 , i++ i变为3
i+=j ==> i=3, j=2 所以 i+j =5
[/Quote]

UP
passionboy03 2009-02-19
  • 打赏
  • 举报
回复
up
[Quote=引用 4 楼 operatingtuzi 的回复:]
引用楼主 joly_zl 的帖子:
C/C++ code[del]#include <iostream>
using namespace std;

int main()
{
int i=1;
int j=i++; //j=1 i=2
if(i>j++&&i++==j) //先进行关系运算,然后是逻辑运算。&&按照从左到右的顺序执行
//等价于i=2,之后j=2 && i运行之后是3
i+=j;//所以i=3+2=5

return 0;
}
[/Quote]
wuyanchao 2009-02-18
  • 打赏
  • 举报
回复
i=5,正确
原因:
int j=i++;//i=2,j=1

if(i>j++&&i++==j)

//按照短路原则,逻辑与和逻辑或先计算左值,j是后自增,先计算,后返回+1的值,i=2大于j=1,左值为真,则计算右
//值,完事i=2,j=2

//同理,i后自增,i=2等于j=2,右值为真,完事i=3,j=2

i+=j;故i=5,j=3


一个表达式里,不要在两个或更多的子表达式中对同一个对象做自增操作,容易把自己绕进去
jqx_ah 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zqz981 的回复:]
line 1. i =1
line 2. j = 1 ==> i变为2
line 3 i =2 > j =1 成立, j++ 变为2, i=2 == j==2 , i++ i变为3
i+=j ==> i=3, j=2 所以 i+j =5
[/Quote]
up
joly_zl 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 maenxiang 的回复:]
初学者把,时间久了都不讨论这类问题。要养成良好的编程习惯。是什么都不重要。重要的不要写出这样难读的代码。改加括号加括号。
[/Quote]
是一家公司的笔试题目。
谁会写这样难看的程序。
maenxiang 2009-02-18
  • 打赏
  • 举报
回复
初学者把,时间久了都不讨论这类问题。要养成良好的编程习惯。是什么都不重要。重要的不要写出这样难读的代码。改加括号加括号。
yangch_nhcmo 2009-02-18
  • 打赏
  • 举报
回复
http://www.cppblog.com/aqazero/archive/2006/06/08/8284.html
operatingtuzi 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 joly_zl 的帖子:]
C/C++ code[del]#include <iostream>
using namespace std;

int main()
{
int i=1;
int j=i++; //j=1 i=2
if(i>j++&&i++==j) //先进行关系运算,然后是逻辑运算。&&按照从左到右的顺序执行
//等价于i=2,之后j=2 && i运行之后是3
i+=j;//所以i=3+2=5

return 0;
}



[/Quote]
joly_zl 2009-02-18
  • 打赏
  • 举报
回复
i++运算符,怎么样来判断什么时候i自加的,不是说要一条语句执行之后i才自加的吗?
这样看来i>j++&&i++==j不是一条语句了?
zqz981 2009-02-18
  • 打赏
  • 举报
回复
line 1. i =1
line 2. j = 1 ==> i变为2
line 3 i =2 > j =1 成立, j++ 变为2, i=2 == j==2 , i++ i变为3
i+=j ==> i=3, j=2 所以 i+j =5
fabric区块链 2009-02-18
  • 打赏
  • 举报
回复
if((i>j++)&&(i++==j))

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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