[ ] - 运算符中的加法和递增表达式
Addition and Increment expression in [ ] - operator
根据标准,以下两个表达式是未定义的行为吗?
int a = 1, b = 1;
int c[] = { 1, 2, 3, 4, 5 };
// Do the following expressions lead to Undefined Behavior ?
c[a++]; // (1)
c[a+b]; // (2)
不,以目前的形式,它们不会导致未定义的行为。没有您可能担心的序列点冲突。
- 在
c[a++];
的情况下,a
的现有值用于索引,a
作为(后增量运算符的)副作用递增。 -
c[a+b];
不会更改任何变量值,a+b
是数组的有效索引。
如果 a 或 b
或 a 和 b 的总和大于数组的大小,您可能会得到未定义的行为:
int a = 1, b = 1;
int c[] = { 1, 2, 3, 4, 5 };
c[a++]; // (1) a = 2
c[a+b]; // (2) a + b = 3
cout << c[a] << endl; // 3
cout << c[a+b] << endl; // 4
cout << a << ", " << b << endl;
如您所见,没有 UB,因为它c[a + b] = c[3]
数组的一个元素。
相关文章:
- 表达式中运算符的 GCC 和 ADL
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 为什么这个涉及重载运算符和隐式转换的C++表达式是不明确的
- 运算符表达式上下文中重载解析的内置运算符候选项的正确行为
- 这些重载运算符如何应用于表达式 d***b?
- 在 C 和 C++ 中,使用逗号运算符的表达式是否未定义"a = b, ++a;"?
- 运算符超载的Lambda表达式
- C++表达式中的运算符优先级
- 使用运算符>>折叠表达式
- 表达式必须具有类类型(运算符)
- C++表达式模板不明确的运算符重载
- 二元运算符"<<"不能应用于类型 "wostream" 和 "string" 的表达式
- 更改对象并将其在同一表达式中使用它是不确定的行为,但是子表达式由逗号运算符分开
- [ ] - 运算符中的加法和递增表达式
- 逗号运算符与圆括号表达式的用法示例
- 折叠表达式作为 [] 运算符的参数
- 关于解引用运算符是否在表达式中产生对象对值的定义不明确
- 混合运算符和表达式新建/删除
- 修复表达式;运算符优先级
- C++ 使用正则表达式搜索"正则表达式运算符"