EMP*_*EMP 22 c syntax pointers language-design
C中的以下声明:
int* a, b;
Run Code Online (Sandbox Code Playgroud)
将声明a为类型int*和b类型int.我很清楚这个陷阱,但我想知道的是它为什么会这样运作.为什么它不也宣布b作为int*,因为大多数人会直觉地想到?换句话说,为什么*适用于变量名,而不是类型?
当然你可以用这种方式写它,以便与它的实际工作方式更加一致:
int *a, b;
Run Code Online (Sandbox Code Playgroud)
但是,我和我所说过的每个人都用"指向int"的类型来思考,而不是指向某些数据的指针,而该数据的类型是"int".
这对C的设计者来说只是一个糟糕的决定还是有一些很好的理由为什么它会被这样解析?我确定之前已经回答了这个问题,但我似乎无法通过搜索找到它.
caf*_*caf 31
C语句以这种方式编写,以便"声明镜像使用".这就是你声明这样的数组的原因:
int a[10];
Run Code Online (Sandbox Code Playgroud)
你是否拥有你提出的规则,总是在哪里
type identifier, identifier, identifier, ... ;
Run Code Online (Sandbox Code Playgroud)
...那么数组逻辑上必须像这样声明:
int[10] a;
Run Code Online (Sandbox Code Playgroud)
这很好,但不反映你如何使用 a.请注意,这也适用于函数 - 我们声明这样的函数:
void foo(int a, char *b);
Run Code Online (Sandbox Code Playgroud)
而不是
void(int a, char* b) foo;
Run Code Online (Sandbox Code Playgroud)
一般情况下,"申报镜子使用"的规则意味着你只需要记住一组关联规则,适用于像无论是运营商*,[]而()当你使用的价值,像声明符相应的令牌*,[]和().
经过一番思考后,我认为值得指出的是,将" 指向int "的拼写为" int*"只是"声明镜子使用"的结果.如果你打算使用另一种声明形式,将" 指向int "的拼写为" &int"或者像" @int" 这样完全不同的东西可能会更有意义.
可能还有其他历史原因,但我总是这样理解:
一种声明,一种类型.
如果a,b,c和d必须与此类型相同:
int a, b, c, d;
Run Code Online (Sandbox Code Playgroud)
然后,该行上的所有内容也必须是整数.
int a, *b, **c, ***d;
Run Code Online (Sandbox Code Playgroud)
4个整数:
它也可能与运算符优先级有关,或者它可能在过去的某个时刻.