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

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

~fly away~

4 Likes

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

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é.

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?

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 :expressionless:

2 Likes

Đặ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 :joy:

1 Like

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

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?

1 Like

Đú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

1 Like
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?

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

1 Like

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ỉ.

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

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

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 " :))

1 Like

~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

1 Like

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

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.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?