What is output of following code?
void main()
{
int ints[] = { 0, 1, 2, 3 };
int* i1 = ints + 1;
int* i2 = ints + 2;
int a = ++*i1 + *i2++;
int b = *++i1 + *i2--;
printf("%d#%d", a, b);
getch();
}
Hãy suy nghĩ và trả lời câu hỏi trước khi xem đáp án
Lời giải:
Báo sai– Lệnh int a = ++*i1 + *i2++;, toán tử * và ++ cùng thứ tự ưu tiên nhưng có thứ tự kết hợp từ phải sang trái. i2++ sẽ được thực hiện trước nhưng i2 sẽ trỏ tới phần tử tiếp theo sau khi i2 được sử dụng( nghĩa là *(i2++) = 2). ++*i1 = ++(i*) = ints[1] = 2. a = 2 + 2 = 4. Sau lệnh này, i2 trỏ tới phần tử cuối cùng của mảng ints[],i1 trỏ tới phần tử thứ 2 của mảng ints[], giá trị ints[1] bị thay đổi (=2).
– Lệnh int b = *++i1 + *i2–;, toán tử * và — cùng thứ tự ưu tiên nhưng có thứ tự kết hợp từ phải sang trái. i2– được thực hiện trước nhưng i2 sẽ trỏ tới phần tử thứ 3 của mảng sau khi i2 được sử dụng( nghĩa là *(i2–) = 3). *++i1 = *(++i1) = ints[2] = 2. b = 2 + 3 = 5.