error C2106: “=”: 左操作数必须为左值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了error C2106: “=”: 左操作数必须为左值相关的知识,希望对你有一定的参考价值。
有如下程序:
已知学生的记录由学号和成绩构成,N名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。
代码:
#include "stdafx.h"
#include<string.h>
#include<conio.h>
#define N 10
typedef struct ss
char num[10];
int score;
STU;
void fun(STU x[],STU y)
int i;
y.score=x[0].score;
y.num=x[0].num;
for(i=0 ;i<N; i++)
if(x[i].score<y.score)
y.score=x[i].score;
y.num=x[i].num;
int _tmain(int argc, _TCHAR* argv[])
STU students[N]="A01",81,"A02",89,"A03",66,"A04",87,"A05",77,
"A06",90,"A07",79,"A08",61,"A09",80,"A10",71;
STU m;
fun(students,m);
printf("MinScore:%d\n",m.score);
printf("MinNum:%s\n",m.num);
为什么在子函数“y.num=x[i].num;”这一步总是会出现提示:error C2106: “=”: 左操作数必须为左值?
#include <string.h>
#include <stdio.h>
#define N 10
typedef struct ss
char num[10];
int score;
STU;
void fun(STU x[],STU *y)
int i;
*y = x[0]; // 结构变量可以直接赋值
for(i = 1 ;i < N; i++)
if(x[i].score < y->score)
*y = x[i];
int main()
STU students[N]="A01",81,"A02",89,"A03",66,"A04",87,"A05",77,
"A06",90,"A07",79,"A08",61,"A09",80,"A10",71;
STU m;
fun(students,&m);
printf("MinScore: %d\\n",m.score);
printf("MinNum: %s\\n",m.num);
return 0;
参考技术A stud[i].sum()=stud[j].sum();
这句是错的,你的stud[i].sum()这是一个函数,虽然有一个返回值,但是,你的stud[ij].sum()这个也是一个函数,但是你这个的返回值想把它赋给一个函数的返回值,你说这个可能吗?你有一块内存可以吗?所以说是错的
你可以再加类里添加一个成员
float
sum;
在sum成员函数中把sum先计算出来,这样你就可以用的 参考技术B 你这条语句出错2113了,p.getFirst()=temp1、p.getSecond()=temp2;
p.getSecond()返回的是一个临时变量,并不能5261存储temp2的拷贝。
顺便举个4102例子,左值相当于汇编的
mov
ax,
3;
在逗号1653左边的叫左值。由于左值是临时变量,不是专能存储对象的地方属,所以编译出错。 参考技术C y.num是指这个数组num[10]的首地址,是一个常量,不能作为左值,你想让结构体x[i]中的数据复制到y中就直接写y=x[i]就可以了。也就是把y.score=x[i].score;y.num=x[i].num;改成y = x[i];
c语言之操作符
1、算数操作符
+ - * / %
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除
法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
2、移位操作符
<< 左移操作符
>> 右移操作符
左移操作符 移位规则:
左边抛弃、右边补0
右移操作符 移位规则:
首先右移运算分两种:
1. 逻辑移位 左边用0填充,右边丢弃
2. 算术移位 左边用原该值的符号位填充,右边丢弃
一个数向右以为结果为:x/2^n
左移结果为:x·2^n;
向右移-31位等于像右移1位
像右移35位等于向右移3位
警告⚠: 对于移位运算符,不要移动负数位,这个是标准未定义的。 例如:
int num = 10;
num>>-1;//error
3、位操作符
位操作符有:
& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
练习一下:
#include <stdio.h>
int main()
{
int num1 = 1;
int num2 = 2;
num1 & num2;
num1 | num2;
num1 ^ num2;
return 0;
}
一道变态的面试题:
不能创建临时变量(第三个变量),实现两个数的交换
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\\n", a, b);
return 0;
}
练习:
编写代码实现:求一个整数存储在内存中的二进制中1的个数
参考代码:
//方法1
#include <stdio.h>
int main()
{
int num = 10;
int count= 0;//计数
while(num)
{
if(num%2 == 1)
count++;
num = num/2;
}
printf("二进制中1的个数 = %d\\n", count);
return 0;
}
//方法2:
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
for(i=0; i<32; i++)
{
if( ((num>>i)&1) == 1 )
count++;
}
printf("二进制中1的个数 = %d\\n",count);
return 0;
}
//思考还能不能更加优化,这里必须循环32次的。
//方法3:
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while(num)
{
count++;
num = num&(num-1);
}
printf("二进制中1的个数 = %d\\n",count);
return 0;
}
//这种方式是不是很好?达到了优化的效果,但是难以想到
以上是关于error C2106: “=”: 左操作数必须为左值的主要内容,如果未能解决你的问题,请参考以下文章
vc/vs常见报错:/****error C2106: '=' : left operand must be l-value****/