关于主要回报值范围的标准说法是什么?说只有255?
因为
int main(void){
return 256;
}
echo $? ; # out 0
Run Code Online (Sandbox Code Playgroud) 使用C99 VLA是个好主意吗?与malloc/free相比,何时使用VLA是否合适?(因为VLA可能会爆炸堆叠?)
我开始学习函数式编程语言Haskell,ML大多数练习都会展示如下:
foldr (+) 0 [ 1 ..10]
Run Code Online (Sandbox Code Playgroud)
这相当于
sum = 0
for( i in [1..10] )
sum += i
Run Code Online (Sandbox Code Playgroud)
所以这让我想到为什么编译器不能知道这是算术级数并使用O(1)公式来计算?特别是对于FP没有副作用的纯语言?这同样适用
sum reverse list == sum list
Run Code Online (Sandbox Code Playgroud)
给定一个+ b = b + a和反向定义,编译器/语言可以自动证明吗?
嗨,最近我在网上看到了很多代码(也在SO上),如:
char *p = malloc( sizeof(char) * ( len + 1 ) );
Run Code Online (Sandbox Code Playgroud)
为什么sizeof(char)?这不是必要的,不是吗?或者只是风格问题?它有什么优势?
在阅读序列点后,我了解到这i = ++i是未定义的.
那么这段代码怎么样:
int i;
int *p = &i;
int *q = &i;
*p = ++(*q); // that should also be undefined right?
Run Code Online (Sandbox Code Playgroud)
假设p和q的初始化取决于某些(复杂)条件.他们可能像上面的情况一样指向同一个对象.会发生什么?如果未定义,我们可以使用哪些工具进行检测?
编辑:如果两个指针不应该指向同一个对象,我们可以使用C99限制吗?这是"严格"的意思吗?
我总是发现有些人(大多数来自印度)正在使用turbo C.我找不到任何理由使用这种过时的编译器...但我不知道在试图告诉他们使用现代编译器时给出的理由是什么( GCC,MSVC,...).
尽管可以使用void指针(泛型指针)在C中编写通用代码,但我发现调试代码非常困难,因为void指针可以在没有编译器警告的情况下采用任何指针类型.(例如,函数foo()接受void指针,它应该是指向struct的指针,但是如果传递char数组,编译器不会抱怨.)在C中使用void指针时,你们都使用什么样的方法/策略?
我想知道静态常量变量是否是线程安全的?
示例代码段:
void foo(int n)
{
static const char *a[] = {"foo","bar","egg","spam"};
if( ... ) {
...
}
}
Run Code Online (Sandbox Code Playgroud) 让我说我有:
switch( choice ) {
case A:
stmt;
do_stmt_related2A;
break;
case B:
stmt;
do_stmt_related2B;
break;
case C: something_different();
...
}
Run Code Online (Sandbox Code Playgroud)
我怎么能避免重复stmt代码?
但有任何解决方法吗?gcc扩展标签作为值看起来非常适合这种情况.
switch( choice ) {
do {
case A: ptr = &&A_label;
break;
case B: ptr = &&B_label;
} while(0);
stmt;
goto *ptr;
case C: ...
Run Code Online (Sandbox Code Playgroud)
是否有任何技巧可以在ANSI-C中做同样的事情?编辑:我当然想到了函数/宏/内联.还有别的吗?这也与表现无关.仅用于教育目的.;)
这就像struct hack.它是否符合标准C?
// error check omitted!
typedef struct foo {
void *data;
char *comment;
size_t num_foo;
}foo;
foo *new_Foo(size_t num, blah blah)
{
foo *f;
f = malloc(num + sizeof(foo) + MAX_COMMENT_SIZE );
f->data = f + 1; // is this OK?
f->comment = f + 1 + num;
f->num_foo = num;
...
return f;
}
Run Code Online (Sandbox Code Playgroud)