Tag: 标准

实现可以指定未定义的行为

3.4.1 1实现定义的行为 未指定的行为,其中每个实现记录了如何进行选择 实现是否可以指定,在未定义的行为是可能的结果的情况下,实现定义的行为是未定义的行为? 例如: 6.3.1.3有符号和无符号整数 3否则,新类型已签名且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号。 因此,只要记录在案,这个结果是否可以由实现未定义并导致未定义的行为,或者它必须具有该实现的定义结果?

我怎样才能理解我的库的标准是什么以及gcc在我的计算机中编译的标准是什么?

这来自我的终端: Korays-MacBook-Pro:~ koraytugay$ gcc –version Configured with: –prefix=/Library/Developer/CommandLineTools/usr –with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) Target: x86_64-apple-darwin14.3.0 Thread model: posix 据我所知,有三种C标准,ANSI C,C99和C11。 我如何知道我拥有哪个库以及我的编译器支持哪些库?

为什么没有“unsigned wchar_t”和“signed wchar_t”类型?

char的签名不是标准化的。 因此,有signed char和unsigned char类型。 因此,使用单个字符的函数必须使用可以包含signed char和unsigned char的参数类型(此类型被选为int ),因为如果参数类型为char ,我们将从编译器获取类型转换警告(如果在这样的代码中使用-Wconversion): char c = ‘ÿ’; if (islower((unsigned char) c)) … warning: conversion to ‘char’ from ‘unsigned char’ may change the sign of the result ( 这里我们考虑如果islower()的参数类型为char会发生什么 ) 而没有明确类型转换使其工作的事情是从char到int自动升级。 此外,引入了wchar_t的ISO C90标准没有说明wchar_t的表示。 来自glibc引用的一些引用: 将wchar_t定义为char是合理的 如果将wchar_t定义为char则由于参数提升,必须将类型wint_t定义为int 。 因此, wchar_t可以很好地定义为char ,这意味着必须应用类似于宽字符类型的规则,即,可能存在wchar_t为正的实现,并且可能存在wchar_t为负的实现。 unsigned wchar_t ,必须存在unsigned wchar_t和signed wchar_t类型(出于与unsigned char和signed char类型相同的原因)。 私有通信显示允许实现仅支持> = 0值的宽字符(与wchar_t的签名无关)。 […]

NaN生成函数的“char-sequence”参数是什么?

除了NAN宏之外,C99还有两种方法可以为浮点数生成NaN值,即nanf(const char *tagp)函数和strtof(“NAN(char-sequence)”) 。 这两种生成NaN的方法都采用可选的字符串参数(在nanf() * tagp,在strtof方法中为char-sequence)。 这个字符串参数到底是做什么的? 我还没有找到你如何使用它的具体例子。 来自cppreference.com我们有: 调用nan(“string”)等同于调用strtod(“NAN(string)”,(char **)NULL); 调用nan(“”)等同于调用strtod(“NAN()”,(char **)NULL); 调用nan(NULL)等效于调用strtod(“NAN”,(char **)NULL); 而nan(3)说: 这些函数返回一个安静的NaN的表示(由tagp确定)。 [snip]参数tagp以未指定的方式使用。 在IEEE 754系统上,有许多NaN表示,tagp选择一个。 这并没有真正告诉我我可以用于tagp字符串或为什么我想要使用它。 此标记字符串的有效选项中是否有列表,以及使用默认nanf(NULL)的原因是什么?

ANSI C编译器可以删除延迟循环吗?

考虑ANSI C中的while循环,其唯一目的是延迟执行: unsigned long counter = DELAY_COUNT; while(counter–); 我已经看到这很多用于强制执行嵌入式系统的延迟,例如。 没有sleepfunction,定时器或中断是有限的。 我对ANSI C标准的解读是,这可以通过符合标准的编译器完全删除。 它没有5.1.2.3中描述的副作用: 访问易失性对象,修改对象,修改文件或调用执行任何这些操作的函数都是副作用,这些都是执行环境状态的变化。 ……并且本节还说: 实际实现不需要评估表达式的一部分,如果它可以推断出它的值未被使用并且不产生所需的副作用(包括由调用函数或访问易失性对象引起的任何副作用)。 这是否意味着可以优化循环? 即使counter是volatile ? 笔记: 这与编译器允许消除无限循环不完全相同? ,因为它指的是无限循环,并且出现关于何时允许程序终止的问题。 在这种情况下,程序肯定会在某个时刻通过这条线,优化与否。 我知道GCC会做什么(删除-O1或更高的循环,除非counter是volatile ),但我想知道标准规定了什么。

(uint64_t)-1是否保证产生0xffffffffffffffff?

我知道,C标准很好地定义了(unsigned)-1必须产生2 ^ n-1,即一个无符号整数,其所有位都置位。 (uint64_t)-1ll 。 但是,我在C11标准中找不到指定如何解释(uint64_t)-1内容。 所以,问题是:C标准是否有任何保证,以下哪项适用? (uint64_t)-1 == (uint64_t)(unsigned)-1 //0x00000000ffffffff (uint64_t)-1 == (uint64_t)(int64_t)-1 //0xffffffffffffffff

是否有任何用例依赖于两个分配的整数表示在C中是不同的?

例如,请考虑以下C代码段: void *p = malloc(1); void *q = malloc(1); bool question = (uintptr_t) p == (uintptr_t) q; 我希望每个人都希望question永远是假的。 (令人惊讶的是,C11标准并不要求它。对uintptr_t的唯一限制是例如((void *) ((uintptr_t) p)) == p 。有关详细信息,请参阅C11标准的7.20.1.4。) 我的问题是:是否有任何实际用例实际上依赖于保证question是错误的,或者更一般地说,两个分配的整数表示是不同的?

一元减去0x80000000(有符号和无符号)

n3337.pdf草案5.3.1.8规定: 一元运算符的操作数应具有算术或无范围的枚举类型,结果是其操作数的否定。 对整数或枚举操作数执行整体提升。 无符号数量的负数是通过从2ⁿ减去其值来计算的,其中n是提升操作数中的位数。 结果的类型是提升的操作数的类型。 在某些情况下,这就足够了。 假设unsigned int是32位宽,那么(-(0x80000000u)) == 0x80000000u ,不是吗? 尽管如此,我找不到关于无符号0x80000000上的一元减号的任何内容。 此外,C99标准草案n1336.pdf,6.5.3.3似乎没有提及: 一元运算符的结果是其(提升的)操作数的否定。 整数提升在操作数上执行,结果具有提升类型。 UPDATE2:我们假设unsigned int是32位宽。 所以,问题是:C中的一元减号(有符号和无符号),以及C ++中的一元减号(仅限签名)? UPDATE1:运行时行为和编译时行为(即常量折叠)都很有趣。 (相关: 为什么是abs(0x80000000)== 0x80000000? )

C字符串追加

我有两个我要追加的C字符串,结果应该分配给lhs变量。 我看到了一个静态初始化代码,如: char* out = “May God” “Bless You”; 。 打印输出真是”May GodBless You” 。 我理解这个结果可以输出一些未定义的行为。 代码实际上是在生产中,从来没有给出错误的结果。 并不是说我们只在一个地方发表过这样的声明。 它可以在非常稳定的代码的多个地方看到并用于形成sql查询。 C标准是否允许这种连接?

简写typedef指向常量结构的指针

使用typedef声明结构 typedef struct some_struct { int someValue; } *pSomeStruct; 然后使用const声明将它作为参数传递给某个函数,暗示’const some_struct * var’ void someFunction1( const pSomeStruct var ) 结果变成了 some_struct * const var 这也在ISO C标准的第6.7.5.1节中说明,该标准指出在这种情况下’const’适用于指针而不适用于它指向的数据。 所以问题是 – 有没有办法用typedef用shortended表示法声明一个const结构的指针,或者必须总是有一个特殊的单独声明: typedef const struct some_struct *pcSomeStruct; void someFunction2( pcSomeStruct var )