我遇到了以下代码片段:
int a = 3;
printf("%d", sizeof(a)++);
Run Code Online (Sandbox Code Playgroud)
显然,这将使用 GCC 9.3.0 和 -std=c99 进行编译。虽然这不编译:
printf("%d", sizeof(3)++);
Run Code Online (Sandbox Code Playgroud)
GCC 打印错误
错误:左值需要作为增量操作数
在我编译第一个片段之前,我会预料到会出现这样的错误。
后缀 ++ 运算符的操作数应为 C99 标准的左值
后缀递增或递减运算符的操作数应具有限定或非限定的实数或指针类型,并且应为可修改的左值。
关于 sizeof Operator 的返回值(如预期):
sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则对操作数求值;否则,不计算操作数并且结果是整数常量。
结果的值是实现定义的,其类型(无符号整数类型)是 size_t,定义在(和其他头文件)中。
sizeof(a)++编译怎么可能?这是未定义的行为还是我错过了什么?
我看过一个例子,显示为
int n = sizeof(0)["abcdefghij"];
cout<<n;
Run Code Online (Sandbox Code Playgroud)
方括号里的那个东西是什么意思?我在某处读过(0)["abc"]相当于("abc")[0]. 意思是上面的表达式很简单
n = sizeof("abcdefghij")[0];
Run Code Online (Sandbox Code Playgroud)
即第一个元素。