c中左值右值怎么回事?

zsl6658 2008-07-22 12:11:45
#include "stdio.h"

int sort(int* arr)
{
int* arr1 = arr;
int* arr2 = arr;
while(arr1!=NULL)
{
while(arr2!=NULL)
{
if(*arr1>*arr2)
{
int temp;
temp = *arr1
*arr1 = *arr2;
*arr2 = temp;
}
arr2++;
}
arr1++;
}
}

int main(int argc,char* argv){
int arr[] = {4,2,6,5,8,9,12,32,54,12,};
int i;
int j;
int c;

printf("The order before sort:\n");
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d\t",arr[i]);
}
printf("\n");

sort(arr);
/*for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
for( j= 0;j<sizeof(arr)/sizeof(arr[0]);j++)
{
if(arr[i]>arr[j])
{
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}*/

printf("The order after sort:\n");
for( j= 0;j<sizeof(arr)/sizeof(arr[0]);j++)
{
printf("%d\t",arr[j]);
}
printf("\n");

c =getchar();

}



1>------ 已启动生成: 项目: BiSearch, 配置: Debug Win32 ------
1>正在编译...
1>main.c
1>c:\documents and settings\zsli\my documents\visual studio 2005\projects\bisearch\main.c(15) : error C2297: '*' : illegal, right operand has type 'int *'
1>生成日志保存在“file://c:\Documents and Settings\zsli\My Documents\Visual Studio 2005\Projects\BiSearch\Debug\BuildLog.htm”
1>BiSearch - 1 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

请问上边的程序有什么问题,c中的左值右值是怎么回事?
...全文
1021 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuanye001 2010-04-29
  • 打赏
  • 举报
回复
原来如此。。。。学习中。。。。
zhoushui 2009-03-02
  • 打赏
  • 举报
回复
差不多 我也清楚了
mars_man 2008-09-16
  • 打赏
  • 举报
回复
比如你写 2=9 ,这明显就是错的,所以 2 只能作为右值,不能作为左值
LiTuX 2008-09-06
  • 打赏
  • 举报
回复
" int main(int argc,char* argv){ "
楼主的主函数是错的!第二个参数应该是char * * argv, 或者char * argv[](其实这是一样的),您的少了一个'*'

另外,关于左值与右值,“右值”几乎可以是任何东东,只要它有值就行。

“左值”必须是变量或者等价物,当然可能不一定就可以赋值,可分为“可赋值的左值”与“只读的左值”,而一般提到的左值常常仅指“可赋值的左值”。

PS:有好多C的专家级人物,元老级人物,在左值与右值上都有分歧,并且不同人的著作甚至标准中提到左值右值时都相当谨慎。
从杰 2008-09-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Athos_K 的回复:]
++i是左值
i++是右值
[/Quote]
错误,VC的编译器告诉我两个i都必须是左值。不信的话可以把下面代码拿去编译一下,strcpy(++a,st)和strcpy(a++,st) 都会报错。

void main()
{
char *st="how are you ";
char a[11],*p;
p = a;
// strcpy(p=a+1,&st[4]); //A
strcpy(++a,st); //B
// strcpy(a,st); //C
// strcpy(p=&a[1],st+2); //D
cout << p << endl;
}

lunarfan 2008-09-06
  • 打赏
  • 举报
回复
一个盒子能放另外一个盒子
而一个盒子中的东西是不能放另外一个盒子的
lunarfan 2008-09-06
  • 打赏
  • 举报
回复

请问上边的程序有什么问题,c中的左值右值是怎么回事?
=============================================
c语言中左值就是盒子,右值就是盒子中放到东西
帅得不敢出门 2008-09-06
  • 打赏
  • 举报
回复
左值看作一个object
右值看作一个value
xvwhappy 2008-09-04
  • 打赏
  • 举报
回复
int* arr1 = arr;
int* arr2 = arr;

arr1所指向的对象在sort这个函数中没有引用或对象名指定, *arr1和*arr2都是右值, 不能出现在赋值符号 = 的左边.C++中可以使用引用来解决
int& arr1 = arr;
int& arr2 = arr;
int temp;
temp = arr1;
arr1 = arr2;
arr2 = temp;

在VC6.0中验证通过.
能不能给点分...
puzzlesky 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 e_sharp 的回复:]
int sort(int* arr) 函数中 temp = *arr1 没有分号,另外函数没有返回值。


a = b;//a左值,b右值
一般主要注意左值,如常量不能为左值。
[/Quote]
e_sharp 2008-07-22
  • 打赏
  • 举报
回复
int sort(int* arr) 函数中 temp = *arr1 没有分号,另外函数没有返回值。


a = b;//a左值,b右值
一般主要注意左值,如常量不能为左值。
Athos_K 2008-07-22
  • 打赏
  • 举报
回复
++i是左值
i++是右值
celtics123 2008-07-22
  • 打赏
  • 举报
回复
左值就是既能放在=号左边,又能放在右边的值;右值只能放在=号右边。
weiyijiji 2008-07-22
  • 打赏
  • 举报
回复
左值通常指某个已经分配了内存空间的变量
右值指任何能产生值的变量,表达式。
上山老人 2008-07-22
  • 打赏
  • 举报
回复
左值还是右值好像和机器本身的规定有关
pengzhixi 2008-07-22
  • 打赏
  • 举报
回复
好象C,C++对左值,右值说得不是很透彻,这概念本来就比较抽象。只能将左值理解为与某一内存相关的值。
chlaws 2008-07-22
  • 打赏
  • 举报
回复
少分号

左值可以理解为地址,右值可以理解为值
右值不能放在等号左边,如3 = a;
r5raxu00 2008-07-22
  • 打赏
  • 举报
回复
可能是分号的问题。
iBug168 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhkefa 的回复:]
temp = *arr1
这句没分号,,
[/Quote]

zhkefa 2008-07-22
  • 打赏
  • 举报
回复
temp = *arr1
这句没分号,,

69,371

社区成员

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

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