这是未定义的行为还是正常输出
Is this a undefined behaviour or normal output
这是一个很简单的问题,但在序列点上甚至有一些疑问。
int a[3] = {1,2,4};
printf("%d",++a[1]);
o/p
3
这是有效的 c 语句吗,我得到输出 3
,这意味着它与
相同
++(a[1])
但这怎么可能,因为我们有一个预递增运算符,它必须先递增 a
,然后才能取消引用。
请指正我的疑惑。我们如何获得 3
?
这就是预增量运算符的工作原理。它类似于 ++count
。所以这里你在 a[1] 的值(因为 [] 比 ++ 具有更高的优先级)被递增,然后它被打印到控制台上。
行为定义明确。运算符 []
的优先级高于前缀 ++
运算符。因此操作数 a
将绑定到 []
。它将被解释为
printf("%d", ++(a[1]));
如您所见:http://en.cppreference.com/w/cpp/language/operator_precedence
运算符 []
的优先级高于 ++
你的括号是对的,你认为应该发生的事情的理由显然是错误的。
如果您是对的,并且前缀递增比索引具有更高的优先级,您将在尝试递增数组时遇到格式不正确的代码的编译器错误。
按原样,绝对不可能出现导致 UB 的排序错误或类似错误。
这是一个很简单的问题,但在序列点上甚至有一些疑问。
int a[3] = {1,2,4};
printf("%d",++a[1]);
o/p
3
这是有效的 c 语句吗,我得到输出 3
,这意味着它与
++(a[1])
但这怎么可能,因为我们有一个预递增运算符,它必须先递增 a
,然后才能取消引用。
请指正我的疑惑。我们如何获得 3
?
这就是预增量运算符的工作原理。它类似于 ++count
。所以这里你在 a[1] 的值(因为 [] 比 ++ 具有更高的优先级)被递增,然后它被打印到控制台上。
行为定义明确。运算符 []
的优先级高于前缀 ++
运算符。因此操作数 a
将绑定到 []
。它将被解释为
printf("%d", ++(a[1]));
如您所见:http://en.cppreference.com/w/cpp/language/operator_precedence
运算符 []
的优先级高于 ++
你的括号是对的,你认为应该发生的事情的理由显然是错误的。
如果您是对的,并且前缀递增比索引具有更高的优先级,您将在尝试递增数组时遇到格式不正确的代码的编译器错误。
按原样,绝对不可能出现导致 UB 的排序错误或类似错误。