例如,
int result;
result = 125/100;
Run Code Online (Sandbox Code Playgroud)
要么
result = 43/100;
Run Code Online (Sandbox Code Playgroud)
结果总会成为师的底线吗?什么是定义的行为?
我从网上找到了这个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中,所有变量都必须在函数的开头声明.我知道在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模式下声明c
并s
导致错误吗?
我要问的是众所周知的"结构的最后一个成员有可变长度"的技巧.它是这样的:
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上有两个编译器
我正在考虑将C++与类一起使用但没有多态(以避免使用vtable).我想使用C++的主要原因是:
在开发非常有限的硬件(4kb RAM)时,您是否认为有理由坚持使用C89?
谢谢你的回答,他们真的很有帮助!
我认为这个主题通过,我会坚持使用C主要是因为:
因为你提供了很多好的答案,所以很难接受一个答案.不幸的是我不能创建一个wiki并接受它,所以我会选择一个让我最想的答案.
编辑:我添加了示例的源代码.
我遇到了这个例子:
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)
哪个产生了这个输出: …
我正在寻找C89/C90标准的免费版本,但我无法在任何地方找到它!为什么这么难找?
C99和C11标准很容易在互联网上获得.即使在Stack Overflow问题中,我在哪里可以找到当前的C或C++标准文档?在C标准中,获得标准不包含我正在寻找的内容.
网络搜索既没有帮助,也没有开放标准.
是否定义了两个非void指针变量(根据C99和/或C++ 98)的差异NULL
?
例如,假设我有一个如下所示的缓冲区结构:
struct buf {
char *buf;
char *pwrite;
char *pread;
} ex;
Run Code Online (Sandbox Code Playgroud)
比如说,ex.buf
指向一个数组或一些malloc的内存.如果我的代码始终保证pwrite
和pread
点阵列中或一个过去,然后我相当有信心,ex.pwrite - ex.pread
总是被定义.但是,如果pwrite
和pread
都是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中的所有函数(main除外)都必须有原型,即使它们只是在同一个翻译单元中定义之后才使用它们吗?