| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1455 人关注过本帖
标题:C语言,i++问题,这个程序有什么问题啊,为什么报错说“j=”这句赋值语句没 ...
取消只看楼主 加入收藏
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:2 
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
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
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
快速回复:C语言,i++问题,这个程序有什么问题啊,为什么报错说“j=”这句赋值语 ...
数据加载中...
 
   



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

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