Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Thoát khỏi for biến có được giữ lại không

  1. #1
    Ngày gia nhập
    11 2010
    Bài viết
    49

    Mặc định Thoát khỏi for biến có được giữ lại không

    Chào mọi người.
    Hiện tại chúng ta đang lạc giữa mê cung các IDE và không biết Cái nào là chuẩn. Hay chuẩn nhất là ngôn ngữ mà không thiết cần theo IDE nào.
    Vấn đề là thế này:
    C Code:
    1.  For (int i=1; i<=5;i++); printf( "%d",i);
    2. // giá trị của I có thay đổi hay không. hay là bị lỗi chưa khai báo biến
    chỉ như thế này thôi nhưng mình đã phải tranh luận với thầy. và nhận dc câu trả lời từ thầy là.
    Code:
    Ta đang tham gia cuộc chơi nào thì phải tuân theo luật cuộc chơi đấy
    Quả thực nếu dùng trình biên dịch khác nhau thì đó ra kết quả khác nhau. Nhưng theo ý kiến chủ quan của bản thân thì for củng là một khối lệnh và i khai báo trong khối lệnh thì sau khi thoát ra i mất giá trị.
    Mình test = turbo dùng cả pointer để xuất địa chỉ cũng đúng nhưng dùng dev C thì nó báo lỗi.
    Mọi ngừoi cho ý kiến nha

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Điều này ko thể đem ra tranh cãi bởi vì nó phụ thuộc trình biên dịch. Một số trình biên dịch cho rằng i thuộc về vòng for và khi thoát khỏi for, biến i sẽ bị hủy. Nhưng một số trình biên dịch cũ lại cho phép khai báo biến ở bất cứ nơi đâu trong chương trình và vòng for cũng ko ngoại lệ. Do đó, bạn xài trình biên dịch nào thì phải theo nó, đừng tốn công tranh luận làm gì vì sự thật đã hiển nhiên như thế rồi.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    11 2010
    Bài viết
    49

    @mèo. Không xét trên trường nghĩa của IDE mình muốn biết theo chuẩn ngôn ngữ. vì thực sự thấy vô lý với lý thuyết FOR(); /* dấu ; */ theo mình thì đã kết thúc lệnh rồi và coi như i đã mất
    (Lúc trước mèo cũng trả lời mình đầu --> anh langman ) không biết lịch sử có diễn ra như vậy không.
    Bạn nào biết C căn bản hết mức để giải thích lý thuyết Biến giùm mình với

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    59

    cái này hình như trên lớp thầy có đề cập, đó là do chuẩn của C thay đổi qua các nắm, bạ đầu thì có chuẩn cho phép tất cả biến điều là toàn cục, tức là giá trị tồn tại đến lúc thoát khỏi chương trình, nhưng các chuẩn sau đã phát sinh ra khái niệm biế cục bộ và quy định lại không giá trị của biến nằm trong hàm mà nó sử dụng thôi.

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Đúng như thế. Theo như một ít kiến thức mình còn nhớ được thì nếu nói về chuẩn, các IDE đều đúng chuẩn như nhau. Ban đầu, C cho phép khai báo biến cục bộ bất cứ nơi đâu trong hàm, và ko có chuẩn nào đề cập đến việc kết thúc lệnh là biến phải bị hủy. Theo chuẩn này thì các IDE cũ vẫn làm đúng. Sau này, người ta quy định thêm tầm vực biến cho các vòng for và biến i được xem như biến cục bộ của vòng for. Do đó, khi ra khỏi vòng for thì biến i sẽ bị hủy. Lý thuyết này cũng ko có gì là mâu thuẫn với lý thuyết về tầm vực biến ở trên cả. Cái gì cũng có những giai đoạn phát triển. Bạn ko thể lấy cái mới và phủ định cái cũ là sai được.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  6. #6
    Ngày gia nhập
    11 2010
    Bài viết
    49

    Mặc định Thoát khỏi for biến có được giữ lại không

    Chắc là phải chấp nhận cái này thôi. Bài kiểm tra mà mình cho là có lỗi thầy lại nói k có lỗi. hêhh.
    Gặp vấn đề mới nên mình tìm hiểu ngay thôi. Vừa học xông bài phạm vi biến nên thấy mâu thuẫn quá.

    Cảm ơn 2 bạn đã góp ý nha

  7. #7
    Ngày gia nhập
    08 2011
    Nơi ở
    /pentest
    Bài viết
    44

    Đây không phải là chuẩn của IDE, IDE không bao giờ tạo ra chuẩn, mà chuẩn phải tuân theo chuẩn của ngôn ngữ, việc bạn khai báo như trên int i trong vòng for (g/s trong C++), hiển nhiên rằng chuẩn C++ thay đổi rất nhiều và nhanh nên khi một version của một IDE nào đó ra đời nó sẽ phải chọn một chuẩn C++ cho nó nên sẽ có sự sai lệch về hành vi là một điều hiển nhiên.
    We are oft to blame in this...'Tis too much proved.
    - That with devotion's visage and pious action we do sugar o'er the devil himself.

  8. #8
    Ngày gia nhập
    11 2010
    Bài viết
    49

    Trích dẫn Nguyên bản được gửi bởi meterpreter Xem bài viết
    Đây không phải là chuẩn của IDE, IDE không bao giờ tạo ra chuẩn, mà chuẩn phải tuân theo chuẩn của ngôn ngữ, việc bạn khai báo như trên int i trong vòng for (g/s trong C++), hiển nhiên rằng chuẩn C++ thay đổi rất nhiều và nhanh nên khi một version của một IDE nào đó ra đời nó sẽ phải chọn một chuẩn C++ cho nó nên sẽ có sự sai lệch về hành vi là một điều hiển nhiên.
    Vậy theo bạn thì như thế nào. Ngôn ngữ C++ mà bạn đang cho là chuẩn thì cái này giải quyết làm sao.
    Qua 1 hồi tranh luận thì đành chấp nhận hiện thực vấn đề là kết quả. nếu sai thì khai báo ra ngoài. Chắc là vậy

  9. #9
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi ghost.love Xem bài viết
    Vậy theo bạn thì như thế nào. Ngôn ngữ C++ mà bạn đang cho là chuẩn thì cái này giải quyết làm sao.
    Qua 1 hồi tranh luận thì đành chấp nhận hiện thực vấn đề là kết quả. nếu sai thì khai báo ra ngoài. Chắc là vậy
    Theo mình biết có mấy loại chuẩn C phổ biến nhất:
    C89 (mặc định với nhiều compiler C): không cho phép khai báo variable trong vòng lặp for
    C99, C++, C++0x: quy định giống như nhau: scope của các biến được khai báo trong vòng lặp for là nội tại trong vòng for đó. Ra ngoài vòng lặp for, biến đó không còn nữa. 1 số compiler như VC6 chẳng hạn, vi phạm quy định này và là sai! (Microsoft gọi đó là extension - nhưng 1 extension đúng nghĩa chỉ bổ sung thêm tính năng chứ không nên làm thay đổi cách thực hiện chương trình như vậy. VC6 có compiler option để bỏ microsoft extension đi, nhưng hầu hết các thư viện đi kèm đều đòi hỏi phải có microsoft extension mới chịu chạy)

    Nếu bạn thực sự thích tranh luận với thày thì nên có 1 lập luận chặt chẽ. Bạn down document phổ biến nhất (google: cxx_standard.pdf) về, tìm trong mục 6.5.3 sẽ thấy nói đến vấn đề này.
    -3- If the for-init-statement is a declaration, the scope of the name(s) declared extends to the end of the for-statement. [Example:

    int i = 42;
    int a[10];

    for (int i = 0; i < 10; i++)
    a[i] = i;

    int j = i; // j = 42


    --- end example]
    hoặc vào link này xem cũng được:
    http://www.kuzbass.ru:8086/docs/isocpp/stmt.html

    Chú ý: document trên (cxx_standard.pdf) được dùng phổ biến rộng rãi và được tất cả mọi người trên thế giới cậy dựa vào để tra cứu chuẩn C/C++. Nhưng mình nhớ đã đọc ở đâu đó thì document chuẩn chính thức là có bản quyền, không được công bố rộng rãi, muốn đọc thì phải mua. Có điều document phổ biến kia trùng đến > 99.99% với chuẩn. Nhớ mang mang vậy, có gì sai các bạn có kinh nghiệm correct giùm. Mình chỉ nhớ là tuy không phải document chính thức nhưng hoàn toàn tin cậy được.

  10. #10
    Ngày gia nhập
    08 2011
    Nơi ở
    /pentest
    Bài viết
    44

    @all : Đọc tài liệu đi kèm theo trình biên dịch bạn đang sử dụng (để biết nó sử dụng chuẩn nào), tham khảo thêm các chuẩn của ngôn ngữ đang dùng.

Các đề tài tương tự

  1. Lưu giá trị biến sau khi thoát chương trình
    Gửi bởi lieutandat trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 8
    Bài viết cuối: 28-11-2013, 11:31 PM
  2. Lập trình C Thay đổi giá trị của biến toàn cục sau khi thoát hàm.
    Gửi bởi vietthang267 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 29-11-2012, 12:10 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn