黑马程序员技术交流社区

标题: 求解 [打印本页]

作者: 郑亚鸽    时间: 2014-4-26 23:53
标题: 求解
本帖最后由 郑亚鸽 于 2014-4-27 12:53 编辑

           typedef struct{

               int year;

               int month;

               int day;

           }Date;
         #import<Foundation/Foundation.h>
          @interface Student:NSObject
          {              @public
              Date birthday;
              double weight;           }
           - (void)eat;
           - (void)run;
           @end
           @implementation Student
           - (void)eat
           {                weight += 1;
                NSLog(@"吃完这次后的体重是%f",weight);
            }
           - (void)run
           {                 weight -= 1;
                 NSLog(@"跑完这次后的体重是%f",weight);            }                      int main()
            {                  Student *s = [Student new];
                 s->weight = 50;
                // s->birthday = {2011,9,10};写法错误                               Date d = {2011,9,10};   //定义结构体变量的同时赋值
                 [s eat];
                 [s run];               
                 return 0;             }
在main函数中给birthday赋值为什么不能用 s->birthday = {2011,9,10};只能用Date d = {2011,9,10};
不理解 ???



作者: gaoxinglei123    时间: 2014-4-27 00:10
这个是结构体的初始化。和一维数组初始化是一样的。只能在声明时初始化才能用int a[]={1,2,3}这种形式。而int a[3];a={1,2,3};是错误的写法
作者: 执着的土豆    时间: 2014-4-27 00:48
本帖最后由 执着的土豆 于 2014-4-27 00:57 编辑

答案在主函数的备注里面,自己看一下,不明白请追问。我觉得写的还是挺详细的。
    //s->birthday = {2011,9,10};  //为什么不能赋值呢?这个不只是在oc中不可以,在c中也不可以。这行代码中在c里面解释为如下面这行代码,看着会不会很别扭?
    //Data={2011,9,10};
    //给你举个例子可能会明白点:定义一个整形变量,值为5.你会不会写 int=5?? 你试试写int=5,编译器会报什么错误?是不是跟这个一样的错误?你总要给个类型的接收者啊。
    //int a=5;这句代码是不是可以拆分为  int a;a=5;先定义一个整形的变量a,再将5赋给a, 那么下面这句也是一样的道理。
    //Date d={2011,9,10};//定义结构体变量的同时赋值  [你都知道这是定义一个结构体变量了,而上面的代码你就没有定义一个结构题的变量,你只是指向那个结构体的类型就要给人家赋值,都没有给人家定义一个变量]
  1. typedef struct{
  2.    
  3.     int year;
  4.    
  5.     int month;
  6.    
  7.     int day;
  8.    
  9. }Date;
  10. #import<Foundation/Foundation.h>
  11. @interface Student:NSObject
  12. {
  13.    @public
  14.     Date birthday;
  15.     double weight;
  16. }
  17. - (void)eat;
  18. - (void)run;
  19. @end
  20. @implementation Student
  21. - (void)eat
  22. {                weight += 1;
  23.     NSLog(@"吃完这次后的体重是%f",weight);
  24. }
  25. - (void)run
  26. {                 weight -= 1;
  27.     NSLog(@"跑完这次后的体重是%f",weight);
  28. }
  29. @end
  30. int main()
  31. {
  32.     Student *s = [Student new];
  33.     s->weight = 50;
  34.     //s->birthday = {2011,9,10};  //为什么不能赋值呢?这个不只是在oc中不可以,在c中也不可以。这行代码中在c里面解释为如下面这行代码,看着会不会很别扭?
  35.     //Data={2011,9,10};
  36.     //给你举个例子可能会明白点:定义一个整形变量,值为5.你会不会写 int=5?? 你试试写int=5,编译器会报什么错误?是不是跟这个一样的错误?你总要给个类型的接收者啊。
  37.    
  38.    
  39.     //int a=5;这句代码是不是可以拆分为  int a;a=5; 那么下面这句也是一样的道理。
  40.     //Date d={2011,9,10};//定义结构体变量的同时赋值  [你都知道这是定义一个结构体变量了,而上面的代码你就没有定义一个结构题的变量,你只是指向那个结构体的类型就要给人家赋值,都没有给人家定义一个变量]
  41.     //s->birthday=d;
  42.     s->birthday.year=10;
  43.     NSLog(@"%d,%d,%d",s->birthday.year,s->birthday.month,s->birthday.day);
  44.     [s eat];
  45.     [s run];
  46.     return 0;

  47. }
  48. /*
  49. 在main函数中给birthday赋值为什么不能用 s->birthday = {2011,9,10};只能用Date d = {2011,9,10};
  50. 不理解 ???
  51. */
复制代码


作者: Er01c    时间: 2014-4-27 01:27
1、结构体的初始化
定义的同时整体赋初值
如果定义之后,则只能单个成员赋初值
2、如何取出结构体变量中的每一个成员        
A)结构体变量名.成员名         
B)指针变量名->成员名 (更常用)                 
指针变量名->成员名   在计算机内部被转化成 (*指针变量名).成员名的方式执行


作者: 郑亚鸽    时间: 2014-4-27 12:53
             明白了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2