int i = 3;
int j = (i)++;
vsint i = 3;
int j = i ++;
上述两种情况的评估方式有区别吗?
第一种情况是否等同于对rvalue进行递增,还是未定义行为?
int i = 3;
int j = (i)++;
vsint i = 3;
int j = i ++;
上述两种情况的评估方式有区别吗?
第一种情况是否等同于对rvalue进行递增,还是未定义行为?
i++
和(i)++
的行为是相同的。C 2018 6.5.1 5表示:
带括号的表达式是基本表达式。它的类型和值与不带括号的表达式相同。如果不带括号的表达式是一个左值、函数指示器或空表达式,则它是一个左值、函数指示器或空表达式。
在C 1999中,措辞是相同的。
(*ptr)++
。 - Snefteli++
与 (i)++
的简单示例中,如Eric Postpischil的答案所述,它们之间没有区别。但是,如果你使用*
运算符解引用一个指针变量并使用增量运算符,则这种差异实际上是有意义的;*p++
和 (*p)++
之间存在差异。#define postinc(x) x++
,那么使用函数式的方式 postinc(*p)
将不会按照您的期望进行操作。这就是为什么在编写宏时通常会使用大量括号进行加强措施,例如 #define postinc(x) ((x)++)
。 - Daniel Schepler(expr) ++
最常见的用法是对解除引用的值进行递增操作,因此让初学者产生 expr ++
与其等价的印象是有害的。 - Govind Parmar
j
中存储3。 - osuka_