2012-07-10 30 views
5

Tôi đã được hỏi trong một cuộc phỏng vấn, dòng in sau trong C là gì? Theo ý kiến ​​của tôi, dòng sau không có nghĩa:Dòng bắt đầu với dấu ngoặc kép có nghĩa là gì trong C?

"a"[3<<1]; 

Có ai biết câu trả lời không?

+0

'" 'có nghĩa là giống như khi một' "' * không * bắt đầu một dòng. Nhưng có, kể từ khi giá trị được bỏ đi (trừ khi dòng được tiếp tục) .. sau đó nó có thể chỉ là mã ngớ ngẩn (nhưng nhìn vào dòng trước đó). –

+0

Biểu thức '" a "[3 << 1]' nên, sau khi biên dịch, giống hệt với biểu thức '(3 << 1) [" a "]'. Bạn có thể hiểu tại sao không? Mặc dù nội dung được đánh giá rõ ràng là không xác định ở đây, nhưng nó sẽ hoàn toàn hợp lệ nếu bạn chuyển toán tử * shift *: '" a "[3 >> 1]', '(3 >> 1) [" a "]' (cả hai là các biểu thức hợp lệ và trả về char '\ 0'). –

Trả lời

13

Đáng ngạc nhiên, nó có ý nghĩa: đó là một chỉ mục thành một mảng các ký tự đại diện cho một chuỗi chữ. Ngẫu nhiên, chỉ số cụ thể này chỉ số tại 6, nằm ngoài giới hạn của chữ, và do đó là hành vi không xác định.

Bạn có thể xây dựng một biểu thức mà làm việc theo mô hình cơ bản giống nhau:

char c = "quick brown fox"[3 << 1]; 

sẽ có tác dụng tương tự như

char c = 'b'; 
+0

Không phải là "không có ý nghĩa" và "hành vi không xác định" hai câu mâu thuẫn? – sepp2k

+2

Tôi không nghĩ vậy. Có nghĩa cú pháp "truy cập phần tử mảng", và ý nghĩa ngữ nghĩa "hành vi không xác định". –

3

nghĩ về điều này:

"Hello world"[0] 

'H'

"Hello world" là một chuỗi chữ. Chuỗi ký tự là một mảng của char và được chuyển đổi thành con trỏ thành phần tử đầu tiên của mảng trong một biểu thức. "Hello world"[0] là phần tử đầu tiên của mảng.

3

Nó có ý nghĩa. Gợi ý: a[b] có nghĩa chính xác giống như *(a+b). (Tuy nhiên, tôi không nghĩ đây là một câu hỏi phỏng vấn tuyệt vời.)

+0

Đặc biệt là câu hỏi không tuyệt vời vì bất kể mã nào có nghĩa là nó chắc chắn không được đảm bảo * in * bất cứ thứ gì. Thiếu các cuộc gọi đến các chức năng I/O, vv .. –

+0

Ồ, có rất nhiều lỗi với nó.Ngẫu nhiên, tôi chỉ nhận ra rằng khi tôi nhìn vào câu hỏi tôi đã hiểu sai nó và nghĩ rằng nó đang hỏi về '(3 << 1) [" a "]' chứ không phải là '" a "[3 << 1]'. (Trên tài khoản của câu hỏi rõ ràng của người hỏi, đó là một phản ứng hợp lý hơn nhiều so với cái cũ hơn.) Và tôi đặt cược "ủng cao su" đang đi đúng hướng và câu hỏi thực sự được hỏi trong cuộc phỏng vấn có '>>' không '<<'. –

2

"a" là một mảng gồm 2 ký tự, 'a'0. 3 << 13*2 = 6, do đó, nó đang cố truy cập phần tử thứ 7 của mảng 2 phần tử. Đó là hành vi không xác định.

(Ngoài ra, các mã không in bất cứ điều gì, ngay cả khi hành vi undefined được lấy ra, vì không có chức năng in ấn được gọi là.)

1

"some_string" [i] trả lại các nhân vật thứ i của chuỗi nhất định. 3<<1 là 6. Vì vậy, "a"[3<<1] cố gắng trả về ký tự thứ 6 của chuỗi "a".

Nói cách khác, mã gọi hành vi không xác định (và do đó, theo nghĩa nào đó, thực sự không có ý nghĩa) vì nó truy cập mảng char ngoài giới hạn.

Các vấn đề liên quan