msc*_*msc 32 c++ arrays undefined-behavior
#include <iostream>
using namespace std;
int main()
{
int arr[3] = { 10, 20, 30 };
cout << arr[-2] << endl;
cout << -2[arr] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
4196160
-30
Run Code Online (Sandbox Code Playgroud)
这arr[-2]超出范围并且无效,导致未定义的行为.但-2[arr]评估为-30.为什么?
不arr[-2]等于-2[arr]?
Chr*_*son 131
-2[arr]被解析为-(2[arr]).在C(和C++,忽略重载)中,X[Y]is 的定义*(X+Y)(参见本问题中对此的更多讨论),这意味着它2[arr]等于arr[2].
Vla*_*cow 67
编译器解析此表达式
-2
Run Code Online (Sandbox Code Playgroud)
喜欢
unary_minus decimal_integer_literal
Run Code Online (Sandbox Code Playgroud)
这是整数文字的定义,不包括符号.
反过来表达
2[arr]
Run Code Online (Sandbox Code Playgroud)
由编译器解析为后缀表达式.
后缀表达式的优先级高于一元表达式.这样表达
-2[arr]
Run Code Online (Sandbox Code Playgroud)
相当于
- ( 2[arr] )
Run Code Online (Sandbox Code Playgroud)
因此,一元减号应用于后缀表达式返回的左值2[arr].
另一方面,如果你写的
int n = -2;
Run Code Online (Sandbox Code Playgroud)
然后
n[arr]
Run Code Online (Sandbox Code Playgroud)
那么这个表达就相当于
arr[-2]
Run Code Online (Sandbox Code Playgroud)
nal*_*zok 18
-2[arr]相当于-(2[arr]),相当于-arr[2].但是,(-2)[arr]相当于arr[-2].