c相关内容
由于将-运算符应用于 unsigned 的 x ,此函数是否调用未定义的行为?我搜索了标准,却找不到解释. unsigned foo(unsigned x){返回x ^ = x&-X;} IMO是. 编辑 void func(unsigned x){printf(“%x",-x);}int main(无效){func(INT_MIN);} IMO 的唯一解释是将其提升为更大的有符
..
C标准规定(强调我的意思): 28指向 void 的指针应具有与字符类型的指针相同的表示和对齐要求. 48)类似地,指针兼容类型的合格或不合格版本应具有相同的表示和对齐要求.所有指向结构类型的指针应具有相同的表示和对齐要求.指向联合类型的所有指针应具有相同的表示和对齐要求.指向其他类型的指针不必具有相同的表示或对齐要求. 48)相同的表示形式和对齐要求旨在隐含与函数的参数,函数的返回值
..
诸如"\ $" 之类的字符串是否非法?为什么或者为什么不?(Gcc和clang给出警告,但将其视为"$" 对待.) \ 后面跟一个没有加反斜杠的字符的情况如何应该保留的保留转义序列? 解决方案 在C11的n1570草案的(非规范性)注释中是明确的.6.4.4.4字符常量段落将转义序列定义为: 转义序列: 简单转义序列 八进制转义序列 十六进制转义序列 通用字符
..
在C11的最新草案之一中([C11_N1570] )我找不到以下陈述的证明(我相信这是众所周知的),请参见下文.谁能推荐我参考C标准的特定部分来证明下面的句子?(如果我错了,请纠正我) 类型 short 与 signed short (待办事项:链接)相同. [[un] signed] short 类型与相应的 [[un] signed] short int (TODO:链接)相同.
..
我从“> https://www.geeksforgeeks.org/the-offsetof获取了代码-macro/. 我运行了gfg本身提供的ide中的代码. 我对代码进行了一点编辑,sizeof(int)显示4,但是通过offset占用结构中的8个字节 #include#定义OFFSETOF(TYPE,ELEMENT)((size_t)&((((TYPE
..
这篇文章没有答案我的问题. 考虑一下: 枚举序列{VAL1,VAL2 = 1000000000,VAL3 = UINT_MAX};int main(无效){printf(“%lu \ n",sizeof(枚举序列));} 此处 UINT_MAX 是 uint32_t 的最大值(40亿左右) 为什么整个 enum 类型的大小似乎只有4个字节?这仅足以存储一个整数值. 解决方案
..
在 int 数组上的 qsort 和 bsearch 的升序排序回调函数可能看起来像这样: int升序(const void * o1,const void * o2){int a = *(const int *)o1;int b = *(const int *)o2;返回
..
我将举一个的示例GNU C库文档: 13.1打开和关闭文件 本节介绍了用于打开和关闭文件的原语使用文件描述符.open和creat函数在以下位置声明头文件fcntl.h,而在unistd.h中声明了close. 我的问题是: unistd.h 和 fcntl.h 是否可以视为标准C?据我所知,它们应该是 Posix标准的一部分吗? 我们可以说C标准库= Posix函数
..
因此,在过去的几天里,我一直在反对严格的别名规则和有效的类型规则.尽管其精神很明确,但我想对规则有良好的技术理解.请注意,我已经解决了许多有关SO的问题,但是我不认为这里提出的问题已经以与我真正相处的方式得到了回答. 这个问题分为两个部分. 在第一部分中,我将有效类型规则划分为句子,并解释了自己对每个规则的理解.对于每一种方法,请验证我的理解是否正确,如果有缺陷,请纠正我,并解释原因.
..
考虑程序 #includeint main(void){for(int curr = 0; curr
..
1.是否定义了 NULL-NULL ?? 是否已定义(char *)NULL-(char *)NULL .? 是否定义了(uintptr_t)NULL-(uintptr_t)NULL ? 我知道它可以在我所有的实现中使用.但是,从标准角度看,它是什么样的呢?我找不到明确的答案. 编辑:从这个骗子中,我认为问题的一个答案是:是的. 第二个和第三个问题呢? 解决方案
..
我正在读“简而言之C",并且有很多类似的句子: 一条语句指定要执行的一个或多个动作,例如为变量分配值,将控制权传递给函数,或跳转到另一条语句. 我的问题是“执行"这些操作的是什么? 我在这里已经读到C定义为在抽象机上运行,所以我的猜测是抽象机器应该执行这些操作,而像gcc这样的实际编译器的工作是确保如果您根据抽象机的工作方式对程序进行心理评估,那么您将获得与实际使用时相同的结果运
..
在我的理解中, setjmp()和 longjmp()的典型用法是异常处理(在 libpng 中的用法应该是著名的这样的示例),那么最多只有一个调用 setjmp()调用一次 longjmp(). 这样是否可以安全地多次允许一次 setjmp()调用 longjmp()? #include#includejmp_buf jb;我int main(
..
在C11,C ++ 11和C ++ 14中执行以下操作合法吗? static_assert((((-4)>> 1)== -2,“我的代码假定符号扩展为右移"); 或C等效项: _Static_assert((((-4)>> 1)== -2,“我的代码假定符号扩展为右移"); 关于您是否可以使用上述实现定义的操作,我不知道常量表达式的规则. 我知道,无论机器类型如何,都没有定义
..
size_t 是否保证足以代表任何类型的大小?根据此参考: size_t 可以存储理论上可能的对象的最大大小任何类型的(包括数组). 通常这是一个可靠的参考,但是我在标准的相关部分中找不到任何证明或争议的证据. 解决方案 是.根据 C99,在stddef.h中定义了size_t标准(位于sizeof运算符(6.5.3.4)的部分)中: 结果的值是实现定义的,其类型(无符号
..
我没有在C11标准中发现任何说明字符串不能长于 SIZE_MAX (其中 SIZE_MAX 表示 size_t 类型)字符.例如.如果 size_max 是 long ,并且在我的实现中存在一个严格大于 long 的 long long 类型,那么我可以使用 long long 定义和索引这样的字符串. 但是,这暗示着一些异常情况:例如, strlen 可能无法返回字符串的实际大小,因为结果
..
说我有一个具有2个字段的结构,而C的实现在这些字段之间也有一些填充. 如果我创建了该结构的两个变量并将一个变量赋给另一个变量,是否将保证填充等于? 我知道对于大多数编译器来说都是这样(因为它们只是调用memcpy),但是我想知道标准中关于填充的规定是什么? 这个问题的目的是,我可以使用 memcmp 来检查结构是否相等. 说我有一个编译器,该编译器发出的代码仅分配结构的所有
..
当我尝试回答这个问题时,出现了一个有趣的问题: 我的fs上是mv原子吗?/a> 标准是否要求 rename()函数 是原子的? 用于 rename 状态: 此 rename()函数等效于常规文件,由ISO C标准定义.它的包含扩展了定义以包括对目录的操作并指定行为当新参数命名一个已经存在的文件时.那规范要求该函数的操作必须是原子的. 但是,最新的公开发布的ISO C关
..
我正试图向某人解释为什么他们有一个悬空的指针以及自由实际上是如何工作的(指针是值,因此是按值传递的),但是为此,我认为我需要一种打印指针的方法并非“不确定"(例如 printf(“%p",ptr)的情况). memcpy能做到吗? char buf1 [sizeof(char *)];char buf2 [sizeof(char *)];char * malloced = malloc(
..
很明显,以下代码由于算术溢出而调用了未定义的行为: #includeint test(void){INT我= INT_MAX;i ++;/*未定义行为*/返回我} 但是小于 int 的签名类型(例如 short 或 signed char )如何呢?(更小些,我分别假设 SCHAR_MAX
..