我遇到了以下代码片段:
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)++编译怎么可能?这是未定义的行为还是我错过了什么?
在C++ IS的C.1.3(2003.它也在C++ 11 IS中),该标准指出了ISO C和C++之间的差异; 即,为
char arr[100];
Run Code Online (Sandbox Code Playgroud)
sizeof(0, arr)以C语言返回sizeof(char*),但100在C++中.
我找不到sizeof两个参数的文档.明显的后备是逗号运算符,但我不这么认为:sizeof(arr)在C中100; sizeof(0, arr)是sizeof(char*).两个sizeof(0, arr)和sizeof(arr)是100在C++中.
在这种情况下,我可能会忽略IS的重点.有人可以帮忙吗?这类似于09年讨论的问题,但没有人提到IS,我认为没有给出正确的答案.
编辑:实际上,IS正在谈论逗号运算符.因此,出于某种原因,在C中(0, arr)返回a char*,但char[100]在C++中返回a .为什么?
码:
#include<iostream>
using namespace std;
int main()
{
size_t i = sizeof new int;
cout<<i;
}
Run Code Online (Sandbox Code Playgroud)
在GCC编译器中,工作正常,没有任何警告或错误和打印输出8.
但是,在clang编译器中,我收到了以下警告:
warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
size_t i = sizeof new int;
Run Code Online (Sandbox Code Playgroud)
sizeof new int;未定义的行为?在C或C++中,当运算符在运算符中时,不执行递增和递减运算符(++n,--n)sizeof().
int n = 100;
int size_int = sizeof(++n);
std::cout<<n;
Run Code Online (Sandbox Code Playgroud)
我编写了这段代码并运行程序.当然,我认为101将会为我展示.但是,n不是101,它是100.
这是为什么?
C代码喜欢这个:
#include <stdio.h>
#include <unistd.h>
#define DIM(a) (sizeof(a)/sizeof(a[0]))
struct obj
{
int a[1];
};
int main()
{
struct obj *p = NULL;
printf("%d\n",DIM(p->a));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个对象指针p是NULL,所以,我认为这p->a是非法的.但是我已经在Ubuntu14.04中测试了这段代码,它可以正确执行.所以,我想知道为什么......
注意:原始代码在int a[0]上面,但我已经改变了,int a[1]因为每个人似乎都挂在那而不是实际的问题,这是:
sizeof(p->a)当表达式p等于时,表达式是否有效NULL?
我遇到了一段代码片段,对我来说应该会因为分段错误而崩溃,但它可以毫无障碍地工作.有问题的代码加上相关的数据结构如下(在上面找到相关的评论):
typedef struct {
double length;
unsigned char nPlaced;
unsigned char path[0];
}
RouteDefinition* Alloc_RouteDefinition()
{
// NB: The +nBags*sizeof.. trick "expands" the path[0] array in RouteDefinition
// to the path[nBags] array
RouteDefinition *def = NULL;
return (RouteDefinition*) malloc(sizeof(RouteDefinition) + nBags * sizeof(def->path[0]));
}
Run Code Online (Sandbox Code Playgroud)
为什么这样做?我收集了的sizeof的字符*将解决对给定的体系结构指针的大小,但它不应该和好如初,同时取消引用NULL终场?
以下代码在gcc 4.8和Clang 3.2下编译:
int main()
{
int size = 10;
int arr[size];
}
Run Code Online (Sandbox Code Playgroud)
C++标准的8.3.4/1表示数组的大小必须是一个整数常量表达式,这size似乎不是.这是两个编译器中的错误,还是我错过了什么?
最新的VC++ CTP用这个有趣的消息拒绝代码:
error C2466: cannot allocate an array of constant size 0
Run Code Online (Sandbox Code Playgroud)
有趣的是,它似乎认为size是零.但至少它拒绝了代码.gcc和Clang应该不一样吗?
c++ arrays compile-time-constant variable-length-array c++11
根据cppreference:
如果表达式的类型是可变长度数组类型, 则计算表达式,并在运行时计算它计算的数组的大小.
这意味着:如果表达式的类型是VLA类型,则计算表达式.例如:
#include <stdio.h>
int main() {
int i = 0;
int a[i];
printf("%zu\n",sizeof(a[i++]));
printf("%d\n",i); // Here, print 0 instead of 1
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以,根据参考,这里i变成了1.但是,使用我的GCC编译器,i打印为0.
请参阅Wandbox演示.
可能重复:
为什么sizeof(x ++)不能递增x?
只是想知道为什么增量运算符不能在下面的代码片段中工作:
int main()
{
int a = 10;
int b = sizeof(a++);
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出 -
a:10
b:4
#include <stdio.h>
void main()
{
int x = 99;
int y = sizeof(x++);
printf("x is %d", x);
}
Run Code Online (Sandbox Code Playgroud)
以上程序的结果是:
x是99
为什么?任何人都可以告诉为什么sizeof运算符x不会增加.