// // Fraction.m // Fraction // // Copyright (c) 2015年 MC207. All rights reserved. // #import "Fraction.h" @implementation Fraction @synthesize numerator,denominator; -(void) print { NSLog(@"%i/%i",numerator,denominator); } @end // // Fraction.m // Fraction // // Copyright (c) 2015年 MC207. All rights reserved. // #import "Fraction.h" int main(int argc, const char * argv[]) { @autoreleasepool { Fraction *a; Fraction *b; int c,d; [a print]; [b print]; NSLog(@"%i/%i",a.numerator,a.denominator); NSLog(@"%i/%i",[b numerator],[b denominator]); NSLog(@"%i",c); NSLog(@"%i",d+1); if (!a) { NSLog(@"123"); } } return 0; } 2015-03-06 00:48:15.387 Fraction[1380:303] 0/0 a和b并没有初始化只是定义为Fraction类的对象 NSLog的两条分明显示了a和b的两个实例变量为0和0,但是为什么a和b调用print方法却显示不了呢(其实质还是调用a和b的取值方法啊)?还有局部变量c和d也没有初始化 但是显然好像初始化为0了 我记得书上说局部变量没有默认的初始值 使用前要先赋值才可以 这又是为什么呢?求大神详细解答下 小弟刚学 如果发帖位置不对 请告知应该发往哪个版块 谢谢 |
|
你说对了一些,变量都没有初始化,但是编译器是有优化的,a和b被初始化为nil(a、b不是一个脏指针),c、d被初始化成0,虽然没有运行时的问题,但这不是一种好的编程习惯。那后面的就好理解了,a、b是空对象,向空对象发消息(print)返回的也是空(nil == 0),简单值也是当0处理。
补充一点,你用GCC4、LLVM GCC、LLVM 这三个编译器分别编译可能遇到不同的结果,并不是每个编译器都会帮你做默认初始化的。 |
|
新人路过看看
|
|
自己要明确自己的行为,不要指望编译器做出符合自己预期的默认初始化。 |
|
感谢斑竹大大!现在我知道了编译器对此进行了优化,a和b被初始化为nil,那nil即空和0有什么区别吗,比如和后面int c,d被初始化为0比起来,还有简单值也是当0处理怎么理解?[a numerator];结果为0,[a print];没有结果或说没有反应,是因为print方法返回空(就不输出结果了),而numerator方法当0处理(就输出0的结果)?这样吗 |
|
我只是有意测试一下 在实际编写时不会这样去做 就是想知道 同样是[a numerator];就可以得到值为0,而[a print];却得不到任何值,print内部其实就是用numerator方法写的 |
|
40分 |
[a print]当然会什么都得不到,因为没有进入print方法中(a 对象是空的)。
a对象既然不存在(初始化为nil),那么其内存地址就是0x00000000,所以说nil == 0;简单类型都是初始为0的,int = 0, long = 0, float = 0.0f,bool = false 等等 |
太感谢了 终于搞懂了 |