block中出现此种报错: Incompatible block pointer types initializing 'float (^__strong)(float, float)' with a...

当block(代码块)的返回值是float时,应注意的地方:定义的返回值类型一定要与return的返回值类型一样

我们以两个数的四则运算来举例

在main.m文件中的四则运算中,我采用两种返回值类型(int 与 float)相互对照。

 1 #import <Foundation/Foundation.h>
 2 void fun1(int(^block)(int a,int b)){
 3     block(20,2);
 4 }
 5 
 6 void fun2(float(^block)(float a,float b)){
 7     block(20.0,2.0);
 8 }
 9 
10 int main(int argc, const char * argv[]) {
11     @autoreleasepool {
12         
13     //block返回值为int类型
14         int(^myblock1)(int a,int b) = ^(int a,int b){
15             int sum = a+b;
16             int dif = a-b;
17             int squ = a*b;
18             int div = a/b;
19             NSLog(@"和%d 差%d 积%d 商%d",sum,dif,squ,div);
20             return 0;
21         };
22         fun1(myblock1);
23 
24     //block返回值为float类型
25         float (^myblock2)(float a,float b) = ^(float a,float b){
26             float sum = a+b;
27             float dif = a-b;
28             float squ = a*b;
29             float div = a/b;
30             NSLog(@"和%.2f 差%f 积%f 商%f",sum,dif,squ,div);
31             return 0;    //此处有误
32         };
33         fun2(myblock2);
34     }
35     return 0;
36 }

 

分析:

 

初看这段程序,感觉还都挺对,如果在电脑上运行,返回值为“int”类型时,程序可以成功实现,但返回值类型为“float”类型时,在我们运行程序时会出现这样的错误:

Incompatible block pointer types initializing 'float (^__strong)(float, float)' with an expression of type 'int (^)(float, float)'

我们要是知道“block”中的返回值的要求,我们就不难看出代码的错误原因,在第二种方法,返回值为float类型,可“return”返回的值却为“0”,(系统默认“0”为整形),前后矛盾,故而错误;并且我们可以通过验证得知:return后的返回值为0.0或1.25等等float类型的数值时,计算机都会报错,但当我们将return后的数值改为一个float类型的变量(如程序中的sum或dif等)或“0.0f”时,程序就是正确的,可以成功运行,原因就在于定义的返回值类型一定要与return的返回值类型一样

 

转载于:https://www.cnblogs.com/linzhengbo/p/4950915.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值