Tag: c99

C类型转换和添加优先级

下一个表达式的优先级是什么? item = (char*)heap + offset; 是(char*)(heap + offset)还是((char*)heap) + offset ?

C89 vs c99 GCC编译器

如果我使用c89和c99编译以下程序有区别吗? 我得到相同的输出。 两者之间真的有区别吗? #include int main () { // Print string to screen. printf (“Hello World\n”); } gcc -o helloworld -std=c99 helloworld.c vs gcc -o helloworld -std=c89 helloworld.c

什么是“扩展整数类型”?

引用我正在阅读的书: signed char, signed short int, signed int, signed long int, signed long long int都称为标准有符号整数类型 unsigned char, unsinged short int, unsigned int, unsigned long int, unsinged long long int, _Bool称为标准无符号整数类型 除了标准整数类型之外,C99标准还允许实现定义的扩展整数类型 ,包括有符号和无符号。 例如,编译器可能提供有符号和无符号的128位整数类型。 我有第3点的问题。 这些“扩展整数类型”是什么? 任何例子?

C99是否与C89向后兼容?

我习惯了旧式C和最近才开始探索c99function。 我只有一个问题:如果我在我的程序中使用c99,使用gcc的c99标志并将其与之前的c99库链接,我的程序是否会成功编译? 那么,我应该坚持旧的C89还是进化?

将C99代码转换为C89

如何将c99源代码自动转换为c89? 我想用Visual C ++编译c99库,但MSVC只支持c89。 许多更改只是语法,例如struct初始化器,您可以自动编写“de-c99”代码的工具。 这个预处理器是否存在?

size_t的最大大小

我知道在C返回类型的sizeof运算符是size_t是定义的无符号整数类型。 这意味着它的最大尺寸应为65535如C99标准7.18.3所述 : limit of size_t SIZE_MAX 65535 但是在gcc-4.8.2头文件中, stdint.h定义了它的大小远大于65535与C99标准中规定的相反,如下所示, /* Limit of `size_t’ type. */ # if __WORDSIZE == 64 # define SIZE_MAX (18446744073709551615UL) # else # define SIZE_MAX (4294967295U) # endif 请帮助我理解为什么在我的误解背后存在差异或原因。

使用malloc分配char数组

嗨,最近我在网上看到了很多代码(也是关于SO;),如: char *p = malloc( sizeof(char) * ( len + 1 ) ); 为什么sizeof(char)? 这不是必要的,不是吗? 或者只是风格问题? 它有什么优势?

“sizeof(arr )”会导致未定义的行为吗?

有一个众所周知的模式来计算数组长度: int arr[10]; size_t len = sizeof(arr) / sizeof(arr[0]); assert(len == 10); 此模式适用于静态数组和常量大小的自动数组。 它也适用于C99中的可变长度数组。 我想应用类似的想法来计算动态数组大小(以字节为单位): size_t known_len = 10; int *ptr = malloc(known_len * sizeof(int)); size_t size = known_len * sizeof(ptr[0]); assert(size == known_len * sizeof(int)); 这比known_len * sizeof(int)更好,因为sizeof(ptr[0])不引用实际的数组元素类型。 因此,它不需要代码的读者知道类型。 但是我不清楚表达式sizeof(ptr[0])会导致不确定的行为。 随着它扩大: sizeof(ptr[0]) -> sizeof(*((ptr) + (0))) -> sizeof(*ptr) 如果ptr为0 ,结果表达式是有问题的: sizeof(*((int*) 0)) 根据C99标准: (C99,6.3.2.3p3):“值为0的整型常量表达式,或者类型为void […]

序列点和副作用:C11的安静变化?

C99§6.5 表达式 (1)表达式是操作符和操作数的序列,其指定值的计算,或指定对象或函数,或者生成副作用,或执行其组合。 (2)在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的计算来修改一次。 72)此外,先前的值应该是只读的,以确定要存储的值。 73) 用脚注 72)浮点状态标志不是对象,可以在表达式中多次设置。 73)此段落呈现未定义的语句表达式,如 i = ++i + 1; a[i++] = i; 同时允许 i = i + 1; a[i] = i; C11§6.5改为((1)的文本有附录): (1)[…]运算符的操作数的值计算在运算符的结果的值计算之前被排序。 (2)如果对标量对象的副作用相对于对同一标量对象的不同副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义。 如果表达式的子表达式有多个允许的排序,则如果在任何排序中发生这种未测序的副作用,则行为是不确定的。 84) 其中C11中的脚注84与C99中的73相同。 我有点困惑……我把C11(2)看作是“[…](对同一个标量对象的不同副作用)或(使用相同标量对象的值进行值计算)[…]”甚至不允许foo = ++i (有副作用,我们根据更改的对象使用值)。 不过,我不是母语人士,所以如果能告诉我这句话应该如何“解析”会更好。 我理解C99,但我不太明白C11的措辞。 无论如何,实际问题:这是从C99到C11的变化,还是这些措辞相当? 如果是这样,为什么它会被改变? 如果没有,有人可以给出一个表达式的例子,这个表达式在C99中是UB但在C11中不是,反之亦然?

是否有任何现有的C实现在(un)有符号整数表示中具有填充位?

根据C99,在signed int或unsigned int表示中可能有填充位。 所以我想知道还有任何实现有这样过时的东西吗?