| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1455 人关注过本帖
标题:C语言,i++问题,这个程序有什么问题啊,为什么报错说“j=”这句赋值语句没 ...
只看楼主 加入收藏
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:8 
C语言,i++问题,这个程序有什么问题啊,为什么报错说“j=”这句赋值语句没有左值啊??
#include<iostream>
using namespace std;
int main()
{
int i=3,j=4;
int a=i*i+++i++;
int b=j*++j+++j;   //报错说是这句没左值!
cout<<"a="<<a<<"\nb="<<b<<endl;
system("pause");
return 0;
}
这是网上看到的,详情见:http://my.  他这里输出结果是12,42,而我试的时候居然编译报错
搜索更多相关主题的帖子: C语言 
2012-11-22 12:10
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
就这类题目  研究没啥意义
估计等级考试也许会考

DO IT YOURSELF !
2012-11-22 12:12
heroinearth
Rank: 10Rank: 10Rank: 10
来 自:云南曲靖
等 级:青峰侠
帖 子:430
专家分:1506
注 册:2011-10-24
收藏
得分:3 
int a=i*i+++i++;根据你这句,++的结合是:a=i*(i++)+ (i++) 同理下面这句
int b=j*++j+++j; 的结合是:b=j* (++j++) + j ,这样(++j)++  ,++j是个表达式,表达式是不可以做左值的

我去看了下原代码,可不是你写的这样,是有空格限定怎样结合的。

[ 本帖最后由 heroinearth 于 2012-11-22 12:51 编辑 ]
2012-11-22 12:46
liufashuai
Rank: 9Rank: 9Rank: 9
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
威 望:1
帖 子:370
专家分:1374
注 册:2012-6-22
收藏
得分:12 
int b=j*++j+++j; 的结合是:b=j* (++j++) + j ,这样(++j)++  ,++j是个表达式,表达式是不可以做左值的

楼上的前面分析是正确的,但是最后好像有点问题

编译器一般采用的是贪吃算法,所以,编译器在解释该表达式时从左到右直到不能视为一个表达式,因此:
int b=j*++j+++j; 的结合是:b=j* (++j++) + j
但是此时不是 这样(++j)++  
而应该是解释成 ++(j++)了,所以编译时候会提示错误
因为j++是后加,先进行运算,这就表明了它没计算之前还是一个式子,++一个式子肯定会出现问题
但是如果是楼上所分析的那样 (++j) ++,这明显先算括号里面的,括号里面是先做++计算,结果是一个值,然后再做一个后置++,这是正确的
另外我在VC6.0上运行 (++j)++这种形式可以通过,而++(j++)却不能通过,提示缺少左值什么的错误

之所以编译器会分析成这样,我估计是一元操作符的右结合性导致的

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。






2012-11-22 16:53
一个孩子
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:356
专家分:954
注 册:2012-10-1
收藏
得分:1 
编译是死的,它无法辨别你的表达式,你可以看一下c和指针,它讲的很清楚的。。

重要的不是结果,是求一个结果的过程,哪怕千难万难,当你有想要的结果时,你已走的很远
2012-11-22 17:50
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
收藏
得分:0 
以下是引用heroinearth在2012-11-22 12:46:55的发言:

int a=i*i+++i++;根据你这句,++的结合是:a=i*(i++)+ (i++) 同理下面这句
int b=j*++j+++j; 的结合是:b=j* (++j++) + j ,这样(++j)++  ,++j是个表达式,表达式是不可以做左值的

我去看了下原代码,可不是你写的这样,是有空格限定怎样结合的。


源码确实有空格,哪些空格有什么作用啊?隔开了就结合不了了吗?

还有就是现在这种没空格的情况之下,你是怎么确定每个表达式的结合性的啊,为什么int a=i*i+++i++;根据你这句,++的结合是:a=i*(i++)+ (i++)???
int b=j*++j+++j; 的结合是:b=j* (++j++) + j ,这样(++j)++ ??而不能是其他方式结合呢?遵循的是什么原则啊,如果遇到类似的问题怎么去判断他们的结合性啊??
2012-11-22 22:47
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:1 
这类型题目 对于考试有用,其实过意研究这个是没有意思的,直接看汇编就清楚了

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-11-22 22:53
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
收藏
得分:0 
以下是引用liufashuai在2012-11-22 16:53:39的发言:


楼上的前面分析是正确的,但是最后好像有点问题

编译器一般采用的是贪吃算法,所以,编译器在解释该表达式时从左到右直到不能视为一个表达式,因此:
int b=j*++j+++j; 的结合是:b=j* (++j++) + j
但是此时不是 这样(++j)++  
而应该是解释成 ++(j++)了,所以编译时候会提示错误
因为j++是后加,先进行运算,这就表明了它没计算之前还是一个式子,++一个式子肯定会出现问题
但是如果是楼上所分析的那样 (++j) ++,这明显先算括号里面的,括号里面是先做++计算,结果是一个值,然后再做一个后置++,这是正确的
另外我在VC6.0上运行 (++j)++这种形式可以通过,而++(j++)却不能通过,提示缺少左值什么的错误

之所以编译器会分析成这样,我估计是一元操作符的右结合性导致的


说的很详细,谢谢了!!大概意思我懂了,另外一点就是想问下您:贪心算法原则是不是左结合,比如i+++j,的结合是(i++)+j,另外就是你上面提高的inta=++i+++j类似这样的表达式是不是结合性都是:inta=(++i++)+j;但是这种表达式都是错误的?是这个意思吗??
2012-11-22 22:56
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
收藏
得分:3 
int b=j*++j+++j;

中间的j 在++j后返回一个值 值不能在执行后面的++ 只有左值才能执行 所以提示
error C2105: '++' needs l-value

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-11-22 23:15
快速回复:C语言,i++问题,这个程序有什么问题啊,为什么报错说“j=”这句赋值语 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016937 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved