我正在阅读Brian W. Kernighan和Dennis M. Ritchie在第46页上的“C编程语言”,其中指出“递增和递减运算符只能应用于变量;表达式如{{1}是非法的“。为什么不能在变量之前或之后使用呢?
答案 0 :(得分:18)
我不确定你的意思是“仅在变量之前”。运算符++
和--
(后缀和前缀)都需要可修改的左值作为操作数。左值不一定用立即变量名表示。
例如,你可以这样做
int a[10] = { 0 };
++*(a + 5);
您的理解中*(a + 5)
是“变量”吗?
i + j
的问题不在于它“不是变量”。 i + j
的问题在于它不是左值。这就是为什么你不能将++
应用于它。
在C语言中,术语“变量”有时被用作术语“可修改的[标量]对象”的半非正式同义词,后者又与术语“可修改的左值[标量类型]”同义。你所指的那本书可能在半非正式的意义上使用了“变量”一词。从这个意义上说,*(a + 5)
也是一个“变量”。
答案 1 :(得分:3)
操作数必须具有算术或指针数据类型,并且必须引用可修改的数据对象。
答案 2 :(得分:2)
因为(i + j)是添加两个变量的结果,所以你没有实际存储i + j的变量它只是一个计算结果,所以它就像说,让我们一样假设i = 1,并且j = 2,i + j等于3,并且3 ++无效,因为3是r值。有关详细信息,请转到http://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c