【发布时间】:2022-01-14 03:12:24
【问题描述】:
这纯粹是基于理论,但我有这个代码:
int i = 3, k[] = {2, 4, 6, 8, 10, 12}, *x = &i, *y = k;
double d = 1.5;
struct point_tag {
int x, y;
char *name;
} pt[] = {{200, 40, "begin"}, {300, 100, "end"}}, *pp = pt;
还有这两个表达式:
pt[i--].y+50 在运行时导致未定义的行为
*(*pp.name+2) 无法编译
我只想知道为什么上面的不能运行,为什么下面的不能编译,尽管*((*pp).name+2) 可以。
【问题讨论】:
-
了解运算符优先级(
.与*)。 -
“在运行时导致未定义的行为”如果您不知道原因,您如何知道它会导致未定义的行为?
-
基本上:不要编写奇怪和不必要的复杂代码,也不会出现奇怪的错误。没有理由您应该在访问数组的位置执行
i--,而只需使用 for 循环。没有理由你应该进行指针解引用和算术运算,只需使用可读且无错误的[]运算符。 -
下次请出示minimal reproducible example,大家会轻松很多。