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 "stdafx.h"
#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: “=”: 左操作数必须为左值的主要内容,如果未能解决你的问题,请参考以下文章

错误 c2106:“=”:左操作数必须是 I 值

vc/vs常见报错:/****error C2106: '=' : left operand must be l-value****/

0

C ++返回指针值不可更改

在 r 值概念上需要一些帮助

C++ 错误“左操作数必须是左值”