【C99标准翻译1】sizeof

2023-12-29 11:50
文章标签 翻译 sizeof 标准 c99

本文主要是介绍【C99标准翻译1】sizeof,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C++编程专家》在第2章 (这不是Bug,而是语言特征)第三节(误做之过)中的骆驼背上的重载中,讲到了括号重载造成sizeof多重意义的例子。

例子1

p=N*sizeof*q;

r=malloc(p);

例子2

apple=sizeof(int)*p;


在例子1中我们可以从第二句中看出,第一句只有一个乘号。但是例子2到底是先计算int类型的字节数再乘以即apple=(sizeof(int))*p,还是计算指针p(被强制转换成int)的字节数呢,即apple=sizeof((int)*p)。


例子中给出了发生歧义的原因:sizeof的操作数是个类型名时,两边必须加括号,但操作数如果是变量则不必要加括号。这在C99标准中明确的有说明。

本文翻译了C99标准中关于sizeof的部分:C.语言标准草案.1999(C)ISO!IEC.9899;1999(E).pdf

翻译中文为:

6.5.3.4 sizeof 操作符

限制

1 sizeof操作符不能作用于有函数类型或者不完整类型的表达式,也不能用于加括号的类型名称,也不能用于 指定位域成员的表达式。

语义


2 sizeof操作符返回操作数的大小(比特),操作数可以是表达式或者加括号的类型名。最终大小由操作数的类型确定。结果是个整数。如果操作数的类型是一个可变长度的数组类型,操作数被求值。否则,操作数不被求值,结果是一个常量整数值。


3 当操作数中有char ,unsigned char, signed char时(或者其他的有效的形式)结果是1。当操作数中有数组类型,结果是数组中总共的字节数。当操作数中有结构体或者联合类型时,结果是包含内部字节和填充字节总的字节数84

4 结果值是实现定义的,它的类型(无符号整数类型)是size_t,定义在<stddef.h>头文件中(或者其他头文件)

5 例1 sizeof操作符的典型应用是和例程例如内存分配和I/O系统,交流。一个内存分配函数可能接收一个对象的大小(字节)然后返回一个空指针。例如

extern void  *alloc(size_t);
double *dp = alloc(sizeof *dp);
alloc函数的实现为了转换成双精度指针应该确保返回值适当地对齐。

6 例2 sizeof另一个用法是计算数组的元素个数。

sizeof array / sizeof array[0]

7 例3 在这个例子中变长数组的大小被这个函数计算和返回。

<pre name="code" class="cpp">#include <stddef.h>
size_t fsize3(int n)
{char b[n+3];     // 变长数组return sizeof b; // 执行时间 sizeof
}
<pre name="code" class="cpp">84)参数中被声明包含数组或者函数类型,sizeof操作符产生<em>调整(指针)类型</em>的大小。(见6.9.1)

int main()
{size_t size;size = fsize3(10);  //fsize3返回13return 0;
} 

前引:一般定义<stddef.h>(7.17),声明(6.7),结构体和联合体的说明符(6.7.2.1),类型名(6.7.6),数组声明(6.7.5.2)。

 
 

原文:

6.5.3.4 The sizeof operator
Constraints
 The sizeof operator shall not be applied to an expression that has function type or an
incomplete type, to the parenthesized name of such a type, or to an expression that
designates a bit-field member.
Semantics
 The sizeof operator yields the size (in bytes) of its operand, which may be an
expression or the parenthesized name of a type. The size is determined from the type of
the operand. The result is an integer. If the type of the operand is a variable length array
type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an
integer constant.
 When applied to an operand that has type char, unsigned char ,or signed char ,
(or a qualified version thereof) the result is 1. When applied to an operand that has array
type, the result is the total number of bytes in the array.
When applied to an operand that has type char, unsigned char ,or signed char ,
(or a qualified version thereof) the result is 1. When applied to an operand that has array
type, the result is the total number of bytes in the array.
When applied to an operand
that has structure or union type, the result is the total number of bytes in such an object,
including internal and trailing padding.
The value of the result is implementation-defined, and its type (an unsigned integer type)
is size_t, defined in <stddef.h>(and other headers).
EXAMPLE 1 A principal use of thesizeof operator is in communication with routines such as storage
allocators and I/O systems. A storage-allocation function might accept a size (in bytes) of an object to
allocate and return a pointer to void. For example:
extern void *alloc(size_t);
double *dp = alloc(sizeof *dp);
The implementation of the allocfunction should ensure that its return value is aligned suitably for
conversion to a pointer todouble.
EXAMPLE 2 Another use of the sizeof operator is to compute the number of elements in an array:
sizeof array / sizeof array[0]
EXAMPLE 3 In this example, the size of a variable-length array is computed and returned from a
function:
#include <stddef.h>
size_t fsize3(int n)
{
char b[n+3]; // variable length array
return sizeof b; // execution time sizeof
}
When applied to a parameter declared to have array or function type, the sizeof operator yields the
size of the adjusted (pointer) type (see 6.9.1).
 Language 

int main()
{
size_t size;
size = fsize3(10); // fsize3 returns 13
return 0;
}
Forward references: common definitions <stddef.h>(7.17), declarations (6.7),
structure and union specifiers (6.7.2.1), type names (6.7.6), array declarators (6.7.5.2).

PDF截图可以点击下载

1

2

3



这篇关于【C99标准翻译1】sizeof的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/549355

相关文章

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

C 标准库 - `<float.h>`

C 标准库 - <float.h> 概述 <float.h> 是 C 标准库中的一个头文件,它定义了与浮点数类型相关的宏。这些宏提供了关于浮点数的属性信息,如精度、最小和最大值、以及舍入误差等。这个头文件对于需要精确控制浮点数行为的程序非常有用,尤其是在数值计算和科学计算领域。 主要宏 <float.h> 中定义了许多宏,下面列举了一些主要的宏: FLT_RADIX:定义了浮点数的基数。

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

excel翻译软件有哪些?如何高效提翻译?

你是否曾在面对满屏的英文Excel表格时感到头疼?项目报告、数据分析、财务报表... 当这些重要的信息被语言壁垒阻挡时,效率和理解度都会大打折扣。别担心,只需3分钟,我将带你轻松解锁excel翻译成中文的秘籍。 无论是职场新人还是老手,这一技巧都将是你的得力助手,让你在信息的海洋中畅游无阻。 方法一:使用同声传译王软件 同声传译王是一款专业的翻译软件,它支持多种语言翻译,可以excel

《C++标准库》读书笔记/第一天(C++新特性(1))

C++11新特性(1) 以auto完成类型自动推导 auto i=42; //以auto声明的变量,其类型会根据其初值被自动推倒出来,因此一定需要一个初始化操作; static auto a=0.19;//可以用额外限定符修饰 vector<string> v;  auto pos=v.begin();//如果类型很长或类型表达式复杂 auto很有用; auto l=[] (int

MonoHuman: Animatable Human Neural Field from Monocular Video 翻译

MonoHuman:来自单目视频的可动画人类神经场 摘要。利用自由视图控制来动画化虚拟化身对于诸如虚拟现实和数字娱乐之类的各种应用来说是至关重要的。已有的研究试图利用神经辐射场(NeRF)的表征能力从单目视频中重建人体。最近的工作提出将变形网络移植到NeRF中,以进一步模拟人类神经场的动力学,从而动画化逼真的人类运动。然而,这种流水线要么依赖于姿态相关的表示,要么由于帧无关的优化而缺乏运动一致性

linux dlopen手册翻译

名称 dlclose, dlopen, dlmopen 打开和关闭一个共享对象 简介 #include <dlfcn.h>void *dlopen(const char*filename, int flags);int dlclose(void *handle);#define _GNU_SOURCE#include <dlfcn.h>void *dlmoopen(Lmid_t lm

从计组中从重温C中浮点数表示及C程序翻译过程

目录 移码​编辑  传统浮点表示格式 浮点数的存储(ieee 754)->修炼内功 例子:   ​编辑 浮点数取的过程   C程序翻译过程 移码  传统浮点表示格式 浮点数的存储(ieee 754)->修炼内功 根据国际标准IEEE(电⽓和电⼦⼯程协会)  32位 例子:    64位    IEEE754对有效数字M和

标准IO与系统IO

概念区别 标准IO:(libc提供) fopen fread fwrite 系统IO:(linux系统提供) open read write 操作效率 因为内存与磁盘的执行效率不同 系统IO: 把数据从内存直接写到磁盘上 标准IO: 数据写到缓存,再刷写到磁盘上