Announcement

Collapse
No announcement yet.

thắc mắc về câu lệnh if else chain

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] thắc mắc về câu lệnh if else chain

    em có thắc mắc về câu lệnh if else trong c++
    theo như kiểu lập trình hướng sự kiện thì câu lẹnh if rất hay được sử dụng nhưng em đọc mãi vẫn gà phần này !
    giả sử có 1 hàm với chuỗi các câu lệnh if liên tục
    func (int* a= null , nt* b = null)
    {
    int m=1, int n=1;
    if (1) // lệnh if thứ nhất
    m = m+1 ;
    if (m==2) // lệnh if thứ hai
    {
    a=&m;
    b=&n;
    }
    if (a) // lệnh if thứ 3
    {
    // lệnh gì đó
    }
    if(*a ==2) // lệnh if thứ 4
    {
    //asdf
    }
    }
    thắc mắc ở đây là
    ++ câu lệnh if thứ 1 luôn được thực hiện rồi nhưng khi xong câu lệnh đó thì m nhận giá trị bao nhiêu ???
    ++ liệu giá trị của m có thể được đem ra để tính vào if thứ 2 không ???
    ++ giá trị của m có được duy trì và kế thừa qua mỗi lẹnh if hay không hay thoát khởi lệnh if tất cả các biến bị reset về null hết ???
    ++ giả sử câu lệnh thứ 2 đã được thực hiện ( kể cả không thì viết 1 câu lệnh ì khác để gán địa chỉ m,n cho con trỏ a,b để coi như a,b đã được gán cho 1 biến nào đó trong 1 câu lệnh if )
    như vậy giá trị của a có được bảo tồn không ???
    giá trị của *a là bao nhiêu ???
    và thêm nữa là con trỏ khi ra khỏi khối lệnh thì có được lưu lại địa chỉ của biến cục bộ không ???

  • #2
    câu 1: m =2 vì xong câu lệnh if thứ nhất thì m = m + 1 (m=2).
    câu 2: tất nhiên là có vì câu lệnh if thứ 2 vẫn thuộc hàm func().
    câu 3: tất cả câu lệnh if bạn viết ở trên đều nằm trong hàm func() nên m sẽ thay đổi khi các câu lệnh if thay đổi nó. Chỉ khi ra ngoài hàm func() thì mới không biết m là gì thôi.
    câu 4: có bạn ơi, a, b là con trỏ mà. *a = 2.
    câu cuối: tất nhiên, a là địa chỉ của m, khi m không còn được định nghĩa nữa thì a vẫn là địa chỉ "cũ" của m, cho dù giờ không biết m là ai.
    Mình thắc mắc là sao bạn không Debug để xem giá trị của a, m nhỉ?
    Last edited by 11520537; 24-12-2013, 13:30.
    Tôi không hối tiếc những gì mình đã làm. Tôi chỉ hối tiếc những gì đã không làm khi có cơ hội!

    Comment


    • #3
      Originally posted by ratlaga93 View Post
      em có thắc mắc về câu lệnh if else trong c++
      theo như kiểu lập trình hướng sự kiện thì câu lẹnh if rất hay được sử dụng nhưng em đọc mãi vẫn gà phần này !
      giả sử có 1 hàm với chuỗi các câu lệnh if liên tục

      thắc mắc ở đây là
      ++ câu lệnh if thứ 1 luôn được thực hiện rồi nhưng khi xong câu lệnh đó thì m nhận giá trị bao nhiêu ???
      ++ liệu giá trị của m có thể được đem ra để tính vào if thứ 2 không ???
      ++ giá trị của m có được duy trì và kế thừa qua mỗi lẹnh if hay không hay thoát khởi lệnh if tất cả các biến bị reset về null hết ???
      ++ giả sử câu lệnh thứ 2 đã được thực hiện ( kể cả không thì viết 1 câu lệnh ì khác để gán địa chỉ m,n cho con trỏ a,b để coi như a,b đã được gán cho 1 biến nào đó trong 1 câu lệnh if )
      như vậy giá trị của a có được bảo tồn không ???
      giá trị của *a là bao nhiêu ???
      và thêm nữa là con trỏ khi ra khỏi khối lệnh thì có được lưu lại địa chỉ của biến cục bộ không ???
      Trả lời:
      ++ m=m+1 ; Mà ban đầu khai báo m=1 nên kết thúc câu lệnh này m=2
      ++ Đc chứ
      ++ Đc chứ m có phạm vi trong hàm mà
      ++ a trỏ đến địa chỉ của m => *a=m=2 .

      Im a british accent lover

      Comment


      • #4
        cảm ơn tất cả vì đã trả lời nhiệt tình :beauty::beauty:
        [MENTION=12722]11520537[/MENTION] hàm này mình bịa ra vì để hỏi nên ngại debug lắm mà có lỗi thì chả biết làm ntn
        từ những câu trả lời thì em cũng đã hiểu được kha khá rồi nhưng lại có thêm thắc mắc nữa :funny:
        câu hỏi về scope , biến cục bộ , biến global và con trỏ . VD có

        class A {

        public:
        int y;
        A::A();

        }
        A::ham1(A* out , int y) // hàm thứ 1
        {
        A* m = null; // ở đây thì gọi là m thứ nhất thì m này là giá trị nhiêu ? trỏ tới đâu ??
        ham2(&m) // gọi hàm 2 như này có được không ?
        // hàm 2 sẽ thực thi như nào ?? vì các biến con trỏ lại trùng tên nhau ??? nên e không biết thế nào ??
        }

        A::ham2(A** out , int y = null)
        // out ở đây không liên quan nhưng coi như hàm như này vì thắc mắc chỗ return m
        // m là 1 object nên được cấp phát bộ nhớ nhưng lại là biến cục bộ vậy có bị release khi ra khởi hàm không ?
        {
        A* m = new A();
        return m ;
        }
        gọi hàm như sau :
        A m ; A* n ;
        m.ham1(n); // gọi hàm như này có được không ??? nếu được thì y là ???
        m.ham2(n,4);

        mong mọi người trả lời giúp :beauty::beauty:
        việc đọc về local variable và global variable em đã đọc qua nhưng ớ đó chỉ nói đến các biến với kiểu primitive còn về biến con trỏ và kiểu object , struct thì ko có
        ++ con trỏ trong block of code

        int** a ; int* c ; int b = 1 ; // khai bao

        {
        int** a ; int* c ; int b = 1 ; // khai bao cuc bo
        c = & b ;
        a = & c;
        }
        // khi ra khỏi khối lệnh naỳ thì con trỏ cục bộ sẽ như nào
        // nếu con trỏ kiểu object và cấp phát bằng new thì ??

        Comment


        • #5
          Originally posted by ratlaga93 View Post
          cảm ơn tất cả vì đã trả lời nhiệt tình :beauty::beauty:
          [MENTION=12722]11520537[/MENTION] hàm này mình bịa ra vì để hỏi nên ngại debug lắm mà có lỗi thì chả biết làm ntn
          từ những câu trả lời thì em cũng đã hiểu được kha khá rồi nhưng lại có thêm thắc mắc nữa :funny:
          câu hỏi về scope , biến cục bộ , biến global và con trỏ . VD có
          Code:
          class A  {
          
          public:
          int y;
          A::A();
          
          }
          A::ham1(A* out , int y)  // hàm thứ 1 
             {
          A* m = null; // ở đây thì gọi là  m thứ nhất thì m này là giá trị nhiêu ? trỏ tới đâu ??
          ham2(&m) // gọi hàm 2 như này có được không ? 
                       // hàm 2 sẽ thực thi như nào ?? vì các biến con trỏ lại trùng tên nhau ??? nên e không biết thế nào  ??
             }
          
          A::ham2(A** out , int y = null) 
          // out ở đây không liên quan nhưng coi như hàm như này vì thắc mắc chỗ return m 
          // m là 1 object nên được cấp phát bộ nhớ nhưng lại là biến cục bộ vậy có bị release khi ra khởi hàm  không ?                                      
             {
              A* m = new A();
              return m ;   
          }
          * A* m = null; // ở đây thì gọi là m thứ nhất thì m này là giá trị nhiêu ? trỏ tới đâu ??:
          ---> em cho nó = null còn j nữa.
          * ham2(&m);// gọi hàm 2 như này có được không ? :
          --> đương nhiên là được rồi. khi bạn truyền thì công việc sẽ là:
          +1. Tạo 1 biến tạm kiểu A** . Sau đó gán giá trị của biến này là địa chỉ của con trỏ m ( khác với địa chỉ mà m trỏ tới nha) .Xong thì ham2 sẽ dùng biến tạm đó để xử lý.
          //vì các biến con trỏ lại trùng tên nhau ??? nên e không biết thế nào ??
          -> M có thấy ai trùng với ai đâu?

          *// out ở đây không liên quan nhưng coi như hàm như này vì thắc mắc chỗ return m
          // m là 1 object nên được cấp phát bộ nhớ nhưng lại là biến cục bộ vậy có bị release khi ra khởi hàm không ?

          -> Tất nhiên khi ra khỏi ham2 thì m sẽ bị release bởi vì m nằm trên stack, nhưng cái vùng nhớ mà m trỏ tới (cái vùng nhớ vừa đc cấp phát ) thì không.
          Khi return m; -> Tạo 1 biến tạm kiểu A** . Sau đó gán giá trị của biến này là giá trị của m ( m lưu địa chỉ (hay nói cách khác là : giá trị của con trỏ m) của vùng nhớ mà bạn cấp phát trong ham2) . Sau đó cái biến tạm này sẽ đc trả về cho nơi gọi hàm .

          gọi hàm như sau :
          A m ; A* n ;
          m.ham1(n); // gọi hàm như này có được không ??? nếu được thì y là ???
          m.ham2(n,4);
          Tất nhiên là không đc.
          ham1 nhận vô 2 tham số, mà truyền có 1, sao nó chịu.
          Muốn làm đc thế thì lúc định nghĩa hàm 1 thì để biến y có giá trị default thì mới đc:
          VD: A::ham1(A* out , int y=0)



          mong mọi người trả lời giúp :beauty::beauty:
          việc đọc về local variable và global variable em đã đọc qua nhưng ớ đó chỉ nói đến các biến với kiểu primitive còn về biến con trỏ và kiểu object , struct thì ko có
          ++ con trỏ trong block of code

          int** a ; int* c ; int b = 1 ; // khai bao

          {
          int** a ; int* c ; int b = 1 ; // khai bao cuc bo
          c = & b ;
          a = & c;
          }
          // khi ra khỏi khối lệnh naỳ thì con trỏ cục bộ sẽ như nào
          // nếu con trỏ kiểu object và cấp phát bằng new thì ??
          Nói chung nó nằm trong scope nào thì khả năng truy xuất ở trong phạm vi đó.
          Khi new ,malloc,calloc, thì phải delete free. Chứ nó không tự giải phóng vùng nhớ đã cấp phát đc( ai dùng smart pointer thì không nói )

          P/S : Lần sau nhớ cho code vô thẻ [CODE] cho đẹp và dễ nhìn nha
          Last edited by 08520016; 24-12-2013, 18:26.

          Im a british accent lover

          Comment

          LHQC

          Collapse
          Working...
          X