01/10/2018, 09:53

Hỏi về cú pháp lạ trong c++

Mình đang xem bài thầy chi
-YC:Chia m phần thưởng cho n học sinh
-mình thấy có đoạn code này nhưng mình chả hiểu cái đoạn vòng for có cái đoạn " ::n " nghĩa là gì,bác nào thông não em phát,em cảm ơn

*grab popcorn* viết 12:02 ngày 01/10/2018

::n = biến n ở scope global :v
http://ideone.com/JK7DRp

~fly away~

Nguyễn Văn Vương viết 12:08 ngày 01/10/2018

Nhìn code em hiểu sơ sơ,rất mong bác nói rõ hơn ạ

HK boy viết 12:07 ngày 01/10/2018

Theo như @drgnz thì ::n là biến n toàn cục (có đúng không bạn?)
Trong code của bạn ấy up lên thì có 1 biến n ở ngoài là biến toàn cục, còn biến n ở trong là biến cục bộ.
Biến toàn cục và biến cục bộ có thể cùng tên.
Bạn tìm hiểu về biến toàn cục và biến cục bộ nhé.

Dark.Hades viết 12:02 ngày 01/10/2018
paiza.io

Online editor and compiler

Paiza.IO is online editor and compiler. Java, Ruby, Python, PHP, Perl, Swift, JavaScript... You can use for learning programming, scraping web sites, or writing batch

Trường hợp này mình muốn lấy cả n global + n trong main + n namespace thì làm thế nào vậy?

Trần Hoàn viết 11:57 ngày 01/10/2018

Thì ra là còn cái trò này nữa…
Cái vụ gọi biến toàn cục trong hàm có biến cục bộ cùng tên này có phải là kết quả của một người “nghèo nàn về khả năng đặt tên biến” không vậy mọi người? Mình thấy chức năng này thật sự vô dụng

Dark.Hades viết 12:00 ngày 01/10/2018

Đặt tên biến là một trong những “thuật toán” khó nhằn nhất trong lập trình mà bạn cũng không biết sao

Nguyễn Văn Vương viết 11:59 ngày 01/10/2018

chà chà cảm ơn bác nhé

Nguyễn Văn Vương viết 12:05 ngày 01/10/2018

Hang mang với 2 bác,thế rốt cục là nghèo tên biến quá nên họ mới đặt tên như vậy phải k?

HK boy viết 12:06 ngày 01/10/2018

Đúng roài, nói chung là không ai dại đi đặt tên biến giống nhau trong cả global và function cả :v
Hết hồn code :v

Trần Hoàn viết 11:54 ngày 01/10/2018
Vậy trường hợp này thì sao? int x; int main() { int x = 2; ::x = 3; }
Dark.Hades viết 11:59 ngày 01/10/2018
int n = 200;
namespace
{
    int n = 100;
}

int main() {
	// your code goes here
	int n = 10;
	std::cout << n << " " << ::n;
	return 0;
}

trường hợp này thì in cả 3 n ra như nào vậy bạn?

HK boy viết 11:58 ngày 01/10/2018

Không biết giúp được bạn không:

Đúng rồi, Đó là công dụng của toán tử :: Bên cạnh đó nó còn có 2 tác dụng nữa. Anh Tổng kết như thế này TH1: Nếu gọi từ một đối tượng thì :: dùng để gọi phương thức, thành viên lớp cha của lớp hiện tại. TH2: Nếu gọi từ namespace, enum thì :: dùng để gọi thành viên của namespace, enum đó TH3: Nếu phía trước :: không có gì, tức không phải TH1, TH2 :: dùng để gọi biến nằm ở ngoài scope Ví dụ: int x; int main() { int x = 2; ::x = 3; // gọi x ở ngoài }

Dark.Hades viết 11:58 ngày 01/10/2018

Trường hợp này thì lấy được n ở ngoài cùng thôi bạn, giả sử mình xóa dòng int n = 200; đi thì kết quả ::n sẽ là 100 -> của namespace.
Vậy để lấy chính xác cả 3 thì làm cách nào nhỉ.

HK boy viết 11:55 ngày 01/10/2018

Bạn đặt tên cho namespace được không?

Dark.Hades viết 11:54 ngày 01/10/2018

Dĩ nhiên là nếu deploy thì sẽ không dùng cái này rồi, nhưng để tìm hiểu thì mình vẫn muốn hiểu rõ nó hơn

Nguyễn Văn Vương viết 11:56 ngày 01/10/2018

Hự hự ,sau một hồi các bác vô phân tích kỹ hơn,thằng em đã " bặt vô âm tín " :))

*grab popcorn* viết 11:59 ngày 01/10/2018

~fly over~

namespace {
 int n;
}

Được replace cho thằng static int n;

Khi viết code C, các biết toàn cục/hàm được gắn keyword static = các biết này chỉ đc xài trong file đó. -> Không thể access bởi các file ngoài. Tuy nhiên C++ thấy ko hay vì static ở C++ nó có nhiều công dụng và ý nghĩa khác nên dùng unnamed namespace để ‘hide’ đi.

~fly away~ :v

Dark.Hades viết 11:59 ngày 01/10/2018

Vậy gọi unnamed namspace đó như thế nào để tường minh vậy bác?

*grab popcorn* viết 11:54 ngày 01/10/2018

Không thể gọi được unnamed namespace nếu như có biết trùng tên ở global.

Tuy nhiên có thể get như sau

namespace {
	int n = 200;
	int getN() {
		return n;	
	}
}

http://ideone.com/JK7DRp

Vì khi này getN và n trong cùng 1 scope nên nó lấy ra được

Và tất nhiên, như trường hợp trên là có n trong main scope nên nó tìm được n = 10
Nếu bỏ n trong main scope đi
Và global scope và unnamed namespace scope đều có n khi gọi n ra nó sẽ chửi cho vì không biết gọi n nào.
http://ideone.com/rvwXzG

Và khi đó phải thông qua scope resolution operator :: để gọi global n. Còn biết n trong namespace kia thì có thể get như trên.

Dark.Hades viết 11:59 ngày 01/10/2018

Cảm ơn bác nhiệt tình giải đáp.
Cái vụ

Và global scope và unnamed namespace scope đều có n khi gọi n ra nó sẽ chửi cho vì không biết gọi n nào.

thì chắc còn tùy vào complier nữa vì ở đây nó vẫn pass như siêu nhân

Bài liên quan
0