标签: c89

整数除法的行为是什么?

例如,

int result;

result = 125/100;
Run Code Online (Sandbox Code Playgroud)

要么

result = 43/100;
Run Code Online (Sandbox Code Playgroud)

结果总会成为师的底线吗?什么是定义的行为?

c math c99 integer-division c89

197
推荐指数
6
解决办法
34万
查看次数

当在C89模式下编译时,以下程序如何输出`C89`和在C99模式下编译时输出`C99`?

我从网上找到了这个C程序:

#include <stdio.h>

int main(){

    printf("C%d\n",(int)(90-(-4.5//**/
    -4.5)));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个程序的有趣之处在于,当它在C89模式下编译和运行时,它会打印C89,当它被编译并在C99模式下运行时,它会打印出来C99.但我无法弄清楚这个程序是如何工作的.

你能解释一下第二个参数如何printf在上面的程序中起作用吗?

c printf comments c99 c89

125
推荐指数
3
解决办法
5605
查看次数

C中的变量声明放置

我一直认为在C中,所有变量都必须在函数的开头声明.我知道在C99中,规则与C++中的规则相同,但C89/ANSI C的变量声明放置规则是什么?

以下代码使用gcc -std=c89和成功编译gcc -ansi:

#include <stdio.h>
int main() {
    int i;
    for (i = 0; i < 10; i++) {
        char c = (i % 95) + 32;
        printf("%i: %c\n", i, c);
        char *s;
        s = "some string";
        puts(s);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

不应该在C89/ANSI模式下声明cs导致错误吗?

c declaration c89

121
推荐指数
5
解决办法
8万
查看次数

C,C99,ANSI C和GNU C有什么区别?

我已经开始编写关于codechef的编程实践,并且对C和C99之间区别感到困惑.C在这里意味着什么?是C89吗?检查此提交底部的语言.它包含C和C99.

我在互联网上发现了一个名为GNU C的东西.对于linux/unix系统有不同的C吗?这些是否符合ANSI的C标准?我也在一些地方读过"C99严格".这是什么?

是否还有其他不同的C标准?有没有叫做C 4.3.2的东西,还是当前使用的gcc版本?

编辑:

这个,这个,这有帮助.我会搜索更多并编辑未回答的内容.

我不是一个编程新手.我知道C语言是什么.我知道ANSI有不同的C标准,如C89,C99和C11.

c gcc c99 c89 ansi-c

115
推荐指数
4
解决办法
7万
查看次数

"struct hack"在技术上是不确定的行为吗?

我要问的是众所周知的"结构的最后一个成员有可变长度"的技巧.它是这样的:

struct T {
    int len;
    char s[1];
};

struct T *p = malloc(sizeof(struct T) + 100);
p->len = 100;
strcpy(p->s, "hello world");
Run Code Online (Sandbox Code Playgroud)

由于结构在内存中的布局方式,我们可以将结构覆盖在一个大于必要的块上,并将最后一个成员视为大于1 char指定的大小.

所以问题是:这种技术在技术上是不确定的行为吗?.我希望它是,但很好奇标准对此有何看法.

PS:我知道C99的方法,我希望答案专门针对上面列出的技巧版本.

c c89 undefined-behavior

109
推荐指数
7
解决办法
9414
查看次数

是否有任何理由使用C而不是C++进行嵌入式开发?

我的硬件C++和C89上有两个编译器

我正在考虑将C++与类一起使用但没有多态(以避免使用vtable).我想使用C++的主要原因是:

  • 我更喜欢使用"内联"函数而不是宏定义.
  • 我想使用命名空间,因为我的前缀使代码混乱.
  • 我认为C++有点类型更安全,主要是因为模板和详细的转换.
  • 我真的很喜欢重载的函数和构造函数(用于自动转换).

在开发非常有限的硬件(4kb RAM)时,您是否认为有理由坚持使用C89?

结论

谢谢你的回答,他们真的很有帮助!

我认为这个主题通过,我会坚持使用C主要是因为:

  1. 在C中预测实际代码更容易,如果你只有4kb的ram,这非常重要.
  2. 我的团队主要由C开发人员组成,因此不会经常使用高级C++功能.
  3. 我找到了一种在C编译器(C89)中内联函数的方法.

因为你提供了很多好的答案,所以很难接受一个答案.不幸的是我不能创建一个wiki并接受它,所以我会选择一个让我最想的答案.

c c++ embedded c89

77
推荐指数
14
解决办法
4万
查看次数

为什么要使用strncpy而不是strcpy?

编辑:我添加了示例的源代码.

我遇到了这个例子:

char source[MAX] = "123456789";
char source1[MAX] = "123456789";
char destination[MAX] = "abcdefg";
char destination1[MAX] = "abcdefg";
char *return_string;
int index = 5;

/* This is how strcpy works */
printf("destination is originally = '%s'\n", destination);
return_string = strcpy(destination, source);
printf("after strcpy, dest becomes '%s'\n\n", destination);

/* This is how strncpy works */
printf( "destination1 is originally = '%s'\n", destination1 );
return_string = strncpy( destination1, source1, index );
printf( "After strncpy, destination1 becomes '%s'\n", destination1 );
Run Code Online (Sandbox Code Playgroud)

哪个产生了这个输出: …

c buffer-overflow c89 strcpy strncpy

77
推荐指数
5
解决办法
17万
查看次数

我在哪里可以找到PDF格式的C89/C90标准?

我正在寻找C89/C90标准的免费版本,但我无法在任何地方找到它!为什么这么难找?

C99和C11标准很容易在互联网上获得.即使在Stack Overflow问题中,我在哪里可以找到当前的C或C++标准文档?C标准中,获得标准不包含我正在寻找的内容.

网络搜索既没有帮助,也没有开放标准.

c ansi c89

76
推荐指数
3
解决办法
4万
查看次数

是否定义了减去两个NULL指针的行为?

是否定义了两个非void指针变量(根据C99和/或C++ 98)的差异NULL

例如,假设我有一个如下所示的缓冲区结构:

struct buf {
  char *buf;
  char *pwrite;
  char *pread;
} ex;
Run Code Online (Sandbox Code Playgroud)

比如说,ex.buf指向一个数组或一些malloc的内存.如果我的代码始终保证pwritepread点阵列中或一个过去,然后我相当有信心,ex.pwrite - ex.pread总是被定义.但是,如果pwritepread都是NULL.我可以只期望减去两个定义为(ptrdiff_t)0或严格兼容的代码需要测试指针为NULL吗?请注意,我感兴趣的唯一情况是两个指针都是NULL(表示缓冲区未初始化的情况).原因在于满足前面的假设,完全符合"可用"功能:

size_t buf_avail(const struct s_buf *b)
{     
    return b->pwrite - b->pread;
}
Run Code Online (Sandbox Code Playgroud)

c c++ c99 c89

75
推荐指数
3
解决办法
2918
查看次数

C89,C90或C99中的所有功能都需要原型吗?

为了真正符合标准,C中的所有函数(main除外)都必须有原型,即使它们只是在同一个翻译单元中定义之后才使用它们吗?

c c99 c89

46
推荐指数
3
解决办法
9975
查看次数