为什么应用 sizeof 运算符时会得到不同的结果?

发布于 2024-11-03 07:50:47 字数 193 浏览 4 评论 0原文

我有这个程序,

#include <stdio.h>
int main()
{
   char arr[100];
   printf("%d", (int)sizeof(0,arr));
}

编译为 C 文件时打印 4,编译为 C++ 文件时打印 100。为什么?我正在使用海湾合作委员会。

I have this program

#include <stdio.h>
int main()
{
   char arr[100];
   printf("%d", (int)sizeof(0,arr));
}

This prints 4 when compiled as a C file and prints 100 as a C++ file. Why? I am using gcc.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

緦唸λ蓇 2024-11-10 07:50:47

在 C 中,逗号运算符右侧操作数的结果具有类型和。在 C 中,逗号运算符不会产生左值。因此,存在左值到右值的转换,导致数组类型衰减为指针类型。因此,在 C 中,您得到的是 sizeof(char*) 的结果。

在 C++ 中,逗号表达式的结果是左值。没有这样的转换[如 C],你得到的是 sizeof(arr) 即 100

In C the result of the right hand operand of the comma operator has a type and value. In C a comma operator does not yield an lvalue. So there is an lvalue to rvalue conversion resulting in decay of array type to pointer type. So in C what you get is the result of sizeof(char*).

In C++ the result of a comma expression is an lvalue. There is no such conversion[as in C] and what you get is the sizeof(arr) i.e 100

枕花眠 2024-11-10 07:50:47

sizeof 是一个运算符而不是函数

因此,您正在执行逗号运算符,它返回正确的操作数作为其结果。

在 C++ 中,这是一个引用,因此它仍然是一个数组并且具有完整的大小。

在 C 语言中,在表达式(带有运算符的任何内容)中,通常 x 的数组类型会转换为指向 x 的指针。但两个运算符有一个特定的例外:sizeof&

因此,由于转换规则的例外,sizeof 是否先到达那里很重要。 (参见 C99 第 6.3.2.1 节。

您可以用另一种方式看待这一点,这里程序在 C 和 C++ 中返回相同的内容。

#include <stdio.h>
int main(void) {
  char arr[100];

  printf("%d\n", (int)sizeof arr);
  printf("%d\n", (int)sizeof(arr + 0));
  return 0;
}

我的 Mac 上的结果:

100
8

† 6.3.2.1(3) 除非它是 sizeof 运算符或一元 & 的操作数。运算符,或者是一个
用于初始化数组的字符串文字,类型为“array of type”的表达式是
转换为类型为“指向 type”的表达式,该指针指向 的初始元素
数组对象,不是左值。

sizeof is an operator not a function

So, you are executing the comma operator, which returns the right operand as its result.

In C++, this is a reference, so it's still an array and has its full size.

In C, in an expression (anything with an operator) normally the type array of x is converted to pointer to x. But there is a specific exception for two operators: sizeof and &.

So it matters if sizeof gets there first or not, because of the exception to the conversion rules. (See C99 section 6.3.2.1.)

You can see this another way, and here the program returns the same thing in C and C++.

#include <stdio.h>
int main(void) {
  char arr[100];

  printf("%d\n", (int)sizeof arr);
  printf("%d\n", (int)sizeof(arr + 0));
  return 0;
}

result on my Mac:

100
8

† 6.3.2.1(3) Except when it is the operand of the sizeof operator or the unary & operator, or is a
string literal used to initialize an array, an expression that has type ‘‘array of type’’ is
converted to an expression with type ‘‘pointer to type’’ that points to the initial element of
the array object and is not an lvalue.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文