C 赋值的左操作数需要左值<;——我不明白这些
为什么每次我想做这些时都会出现这种情况:C 赋值的左操作数需要左值<;——我不明白这些,c,C,为什么每次我想做这些时都会出现这种情况: ((unsigned char)a.ID[b])=((unsigned int)a.ID[b])/ 10; a、 ID是一个无符号字符,它包含一组位。赋值的目标必须是左值,即引用变量位置的表达式。但是强制转换表达式返回一个右值——一个与内存中特定存储位置无关的值。尝试分配给强制转换表达式是没有意义的,因为它不是一个可以存储的位置 您必须在右侧进行两次造型: a.ID[b] = (unsigned char)(((unsigned int)a.ID[b]
((unsigned char)a.ID[b])=((unsigned int)a.ID[b])/ 10;
a、 ID是一个无符号字符,它包含一组位。赋值的目标必须是左值,即引用变量位置的表达式。但是强制转换表达式返回一个右值——一个与内存中特定存储位置无关的值。尝试分配给强制转换表达式是没有意义的,因为它不是一个可以存储的位置 您必须在右侧进行两次造型:
a.ID[b] = (unsigned char)(((unsigned int)a.ID[b])/ 10);
在执行算术之前,内部强制转换将无符号字符
转换为无符号整数
,然后外部强制转换将结果转换回无符号字符
但一开始可能不需要演员char
是一种整数类型,因此您可以对其执行算术运算,就像对int
执行算术运算一样。原始无符号字符
除以10
的结果将与首次将其强制转换为无符号整数
时的结果相同。你可以简单地写:
a.id[b] /= 10;
赋值的目标必须是左值,即引用变量位置的表达式。但是强制转换表达式返回一个右值——一个与内存中特定存储位置无关的值。尝试分配给强制转换表达式是没有意义的,因为它不是一个可以存储的位置 您必须在右侧进行两次造型:
a.ID[b] = (unsigned char)(((unsigned int)a.ID[b])/ 10);
在执行算术之前,内部强制转换将无符号字符
转换为无符号整数
,然后外部强制转换将结果转换回无符号字符
但一开始可能不需要演员char
是一种整数类型,因此您可以对其执行算术运算,就像对int
执行算术运算一样。原始无符号字符
除以10
的结果将与首次将其强制转换为无符号整数
时的结果相同。你可以简单地写:
a.id[b] /= 10;
您无法分配给强制转换的结果。为什么要强制转换
a.ID[b]
而它已经是无符号字符
。您可以强制转换右侧以更改计算的类型,您不需要(也不能,除非在取消引用后出现可怕的指针别名错误)将右侧强制转换为新的赋值类型。尝试将标题更改为“作为赋值的左操作数所需的左值”但我不想这样,因为已经有一个关于这个题目的问题了。Lol。您无法分配强制转换的结果。为什么要强制转换a.ID[b]
而它已经是无符号字符
。您可以强制转换右侧以更改计算的类型,您不需要(也不能,除非在取消引用后出现可怕的指针别名错误)将右侧强制转换为新的赋值类型。尝试将标题更改为“作为赋值的左操作数所需的左值”但我不想这样,因为已经有一个关于这个题目的问题了。Lol.如果真正的目的是在计算之前转换为无符号的
(如果类型是有符号的,则会产生差异),最简单的方法是使用10U
,而不是10
。但是在这种情况下,原始类型是无符号的,所以他只是在计算之前扩展大小。加法或乘法可能会有不同,但除法时不会。是的,我知道。我只是说,因为人们在拼写a类型转换时非常容易,所以使用正确类型的常量就足够了。如果目的真的是在计算之前转换为无符号的
(如果类型是有符号的,这可能会产生影响)最简单的方法是使用10U
而不是10
。但是在这种情况下,原始类型是无符号的,所以他只是在计算之前扩展大小。加法或乘法可能会有不同,但除法时不会。是的,我知道。我只是说,因为人们在拼写a方面非常容易,所以使用正确类型的常量就足够了。