表达式x++;
和x*2;
报告为非法。编译器生成错误。但是,如果x+1;
没有报告错误。
任何人都可以帮助我理解为什么特定表达是非法的吗?或者,换句话说,为什么增加是合法的?
代码:
#include <stdio.h>
int main(void)
{
int x[]={1,2,3,4,5};
x++;
x+1;
x*2;
}
答案 0 :(得分:4)
实际上,您需要了解允许运营商的方式和时间。让我们一个接一个地看。
引自C11
,
++
,后缀增量,章节§6.5.2.3
后缀增量或减量运算符的操作数应具有原子的,合格的, 或不合格的真实或指针类型,并且应该是可修改的左值。
+
,添加剂运算符,章节§6.5.6
另外,两个操作数都应具有算术类型,或者一个操作数应为a 指向完整对象类型的指针,另一个指针应具有整数类型。 (递增是 相当于添加1。)
*
,乘法运算符,章节§6.5.5
每个操作数都应具有算术类型。 [...]
现在,在您的使用中
x++;
- &gt; x
不是可修改的左值,它是“数组类型”。这会导致错误。x+1;
- &gt;满足要求请参阅数组衰减的注释,因此有效。x*2
; - &GT; x
不是算术类型(它的指针类型),因此无效。补充说明:(所有强调我的)
“可修改的左值:”
引用章节§6.3.2.1,
lvalue是一个潜在的表达式(对象类型不是void) 指定一个对象; [...] 可修改的左值是左值 没有数组类型,没有不完整的类型,没有const限定 类型,如果是结构或联合,则没有任何成员(包括, 递归地,所有包含聚合或联合的成员或元素具有const限定 类型。
“算术类型:”
引用§6.2.5,
整数和浮点类型统称为算术类型。 [...]
“数组衰减:”
引用§6.3.2.1,
除非它是
sizeof
运算符,_Alignof
运算符或者&
运算符的操作数。 一元template <int Row, int Col> void some_func(bool my_array[Row][Col]) { //do your stuff //here just printing the array and changing a value for (int i = 0; i < Row; i++) { for (int j = 0; j < Col; j++) std::cout << my_array[i][j]; std::cout << std::endl; } my_array[3][4] = false; }
运算符,或者是用于初始化数组的字符串文字,一个表达式 type ''类型''的数组被转换为类型''指向类型''指针的表达式 到数组对象的初始元素,而不是左值。 [...]
答案 1 :(得分:4)
在这三个陈述中
x++;
x+1;
x*2;
只有两种说法是非法的。这句话
x+1;
是对的。在这种情况下,在表达式中,数组指示符将转换为指向其第一个元素的指针。
没有为指针定义乘法运算符。所以这句话
x*2;
是非法的。
数组是不可修改的左值。您可能无法更改阵列指示符。所以这句话
x++;
是非法的。
答案 2 :(得分:0)
此处,x
是数组,您无法修改数组的地址。这在C中是违法的。
GCC 编译器出错:
In function 'main':
5:5: error: lvalue required as increment operand
x++;
^
7:5: error: invalid operands to binary * (have 'int *' and 'int')
x*2;