关于self.view.frame.size.width赋值会出现expression is not assignable 错误

本文解释了在Swift中尝试直接修改UIView高度时遇到的编译错误“expressionisnotassignable”的原因,并提供了解决方案,即通过临时变量来间接修改UIView的高度。

下面的资料来自于:http://segmentfault.com/q/1010000000177216  


self.view.frame.size.height = 100f;

这样写没法通过编译,编译器会报错"expression is not assignable"

原因是,这句话里面的几个点有两种不同的含义。self.view.frame是Objective-C语法,是读取view属性的frame属性,在Objective-C中使用点来访问属性只是一种语法糖,所以self.view.frame这句话会被转换成:

[[self view] frame]

也就是说,实际上这是消息传递。

而frame属性是一个CGRect结构,所以frame.size.height是C语言的语法,就是访问CGRect结构中的size字段,同样,height是CGSize结构的一个字段。所以,你这句话实际上等于:

[[self view] frame].size.height = 100f;

而Objective-C只是对C语言的一个扩展,所以,上面这句话会被转成C语言的函数调用形式,类似于这种形式:

getframe().size.height = 100f;

而在C语言里,函数的返回值是一个R-Value,是不能直接给它赋值的(所谓的R-Value,就是只能出现在等号的右边,你可以理解成是一个常量;而可以被赋值的是L-Value,可以出现在等号的左边,通常是变量)。因此,当你打算直接给函数的返回值赋值的时候,编译器告诉你"这个表达式无法被赋值"。这就是这个错误的出现原因。

所以,解决办法就是,用一个临时变量保存这个函数的返回值,修改这个临时变量,然后再赋给frame:

// 1. 用一个临时变量保存返回值。
CGRect temp = self.view.frame;

// 2. 给这个变量赋值。因为变量都是L-Value,可以被赋值
temp.size.height = 100f;

// 3. 修改frame的值
self.view.frame = temp;
<think>好的,我现在要解决用户在C++项目中遇到的编译错误:“Expression is not assignable”,出现在mainwindow.cpp文件的第13行。首先,我需要了解这个错误的常见原因,并帮助用户逐步排查问题。 首先,回忆一下C++中“Expression is not assignable错误通常发生在尝试给一个不可修改的左值赋值的时候。常见的情况包括: 1. **尝试给常量或字面量赋值**:例如,写`5 = x;`这样的语句,显然不对,因为5是常量。 2. **运算符优先级问题**:比如在条件表达式或比较操作后误用了赋值运算符,如`if (a == b = c)`,这里可能本意是比较之后赋值,但实际上因为运算符优先级的问题导致语法错误。 3. **错误地使用函数返回值**:例如,函数返回的是一个临时对象或右值,但试图对其进行赋值,如`getValue() = 10;`,除非函数返回的是引用,否则这样会出错。 4. **数组名作为指针常量被赋值**:数组名本身是一个常量指针,不能直接赋值,比如`int arr[10]; arr = new int[20];`这是非法的。 5. **错误使用结构体或类成员访问**:比如,可能错误地访问了const成员,或者通过指针访问成员时符号错误(比如应该用->却用了.)。 接下来,用户提到错误出现在第13行,我需要引导用户检查该行的代码结构。由于用户没有提供具体代码,我需要假设几种可能性,并给出相应的解决步骤。 假设用户的代码可能有以下情况: **情况一:试图给常量或临时变量赋值** 例如: ```cpp const int a = 5; a = 10; // 错误:a是常量,不可修改 ``` 或者: ```cpp int func() { return 42; } func() = 10; // 错误:函数返回的是临时int,不能赋值 ``` **情况二:运算符优先级问题** 比如: ```cpp if (x = y == z) { ... } ``` 这里可能本意是比较y和z,然后将结果赋值给x。但实际由于`==`优先级高于`=`,会被解析为`x = (y == z)`,这在语法上是允许的,但可能触发警告。不过有时候类似的结构也可能导致问题,比如用户可能写的是其他形式。 不过更可能的错误情况是类似: ```cpp a + b = c; // 错误:左边是表达式的结果,不是可修改的左值 ``` **情况三:错误的结构体或类成员访问** 例如: ```cpp MyClass *obj = new MyClass(); obj.value = 10; // 错误:应该用obj->value ``` 或者: ```cpp const MyClass obj; obj.value = 10; // 错误:obj是const,成员不可修改 ``` **情况四:数组赋值** 如: ```cpp int arr[5]; arr = {1,2,3,4,5}; // 错误:数组名不可作为左值被赋值 ``` 需要改为逐个元素赋值或使用memcpy等。 现在,用户需要检查他们的第13行代码是否符合这些情况中的一种。比如,如果用户代码是这样的: ```cpp int a = (x + y) = 5; // 错误:左边的x+y是临时值,不可赋值 ``` 或者: ```cpp if (x == y = z) // 错误:可能本意是 if ((x == y) = z),但语法错误 ``` 又或者: ```cpp std::string s = "hello"; s.size() = 5; // 错误:s.size()返回的是临时值,无法赋值 ``` 根据这些可能性,我需要建议用户检查第13行的表达式,特别是赋值操作的左边是否是有效的左值。 此外,用户可能在使用某些库或类时,错误调用了成员函数,例如: ```cpp QString str = "test"; str.toUpper() = "TEST"; // 错误:toUpper返回的是临时对象,不能赋值 ``` 正确的做法应该是直接赋值给变量: ```cpp str = str.toUpper(); ``` 另一个可能性是用户误用了指针或引用。例如,试图对解引用的指针进行错误操作: ```cpp int *p = &a; *p + 1 = 5; // 错误:左边是*(p) +1,是临时值,不可赋值 ``` 正确的做法可能是修改指针指向的值: ```cpp *p = 5 -1; ``` 总结,用户需要检查第13行的赋值操作符左边是否为一个可以接受赋值的变量、指针解引用、类成员(通过正确的访问方式)等。如果是函数调用、表达式结果、常量等,就会导致该错误。 可能的解决步骤: 1. **检查赋值左边是否为变量或可修改的左值**:确认左边是有效的存储位置。 2. **检查是否有运算符优先级问题**:适当添加括号明确运算顺序。 3. **确认对象是否为常量或只读**:比如const修饰的变量或成员。 4. **检查类成员访问符号是否正确**:指针使用->,对象使用.。 5. **数组操作是否正确**:避免直接对数组名赋值。 如果用户能提供具体的代码行,可以更准确地判断,但在缺乏信息的情况下,上述思路应覆盖大部分可能性。</think>针对C++编译错误"Expression is not assignable",请按以下步骤排查mainwindow.cpp第13行的代码: ### 错误原因分析 该错误表示尝试给不可修改的表达式赋值[^1],常见于: 1. 给函数返回值/临时变量赋值:$getValue() = 10$ 2. 错误使用运算符:$(a == b) = c$ 3. 常量对象修改:$const int x = 5; x = 10;$ 4. 指针/成员访问错误:$obj.value$ 实际应为 $obj->value$ ### 排查步骤 1. **检查赋值操作符左侧** ```cpp // 错误示例(给字符串字面量赋值) "hello" = str; // 左侧必须是变量或可修改内存地址 // 正确写法 str = "hello"; ``` 2. **验证运算符优先级** ```cpp // 错误示例(比较运算符与赋值混淆) if (a = b == c) // 实际解析为 a = (b == c) // 正确写法 if ((a = b) == c) ``` 3. **确认对象可修改性** ```cpp // 错误示例(修改const成员) const QString path = "/data"; path.clear(); // const对象不可调用非const方法 // 正确写法 QString mutablePath = "/data"; mutablePath.clear(); ``` 4. **检查成员访问符号** ```cpp // 错误示例(指针使用点运算符) QPushButton *btn = new QPushButton; btn.text = "Submit"; // 应使用箭头运算符 // 正确写法 btn->setText("Submit"); ``` ### 典型错误场景 ```cpp // 场景1:错误赋值临时对象 std::vector<int> getVector() { return {1,2,3}; } getVector()[0] = 5; // 错误:临时vector不可修改 // 场景2:数组名赋值 int arr[5]; arr = new int[10]; // 错误:数组名是常量指针 ``` ### 解决方案模板 若代码结构为: ```cpp 不可修改的表达式 = 值; ``` 应修改为: ```cpp 变量/可修改内存地址 = 值; ``` 请根据上述指引检查第13行的赋值表达式左右侧结构,特别注意Qt对象操作时的const方法和指针访问规则。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值