我只是学习一些C,或者更确切地说,了解一些神秘的细节.我正在使用VTC高级C编程,其中我发现序列点是:
这些都是正确的吗?关于我试过的最后一个:
void foo (int bar) { printf("I received %d\n", bar); }
int main(void)
{
int i = 0;
foo(i++);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它没有打印1,根据VTC的人所说的,如果我说得不对,它应该,对吧?此外,函数中的这些parens是否与分组parens相同?(我的意思是,他们的优先权).也许是因为parens的优先级高于++,但我也尝试过foo((i ++)); 并得到了相同的结果.只做foo(i = i + 1); 屈服1.
先感谢您.请考虑我来自南美洲所以,如果我不清楚或没有任何意义,请哦,拜托,告诉我.
最热烈的问候,塞巴斯蒂安.
如果我是正确的,做一些像:
char *line;
Run Code Online (Sandbox Code Playgroud)
然后我必须分配一些内存并将其分配给线路,是吗?如果我是对的,问题如下:
在一条线上
while (fscanf(fp,"%[^\n]", line) == 1) { ... }
Run Code Online (Sandbox Code Playgroud)
没有为行分配任何内存我仍然得到正确的行和这些行上正确的strlen计数.
那么,fscanf为我分配那个记忆,它还放置了'\0'吗?我在规范中没有提到这两件事fscanf.
如果我有:
fdata = open(pathf, "r").read().splitlines()
Run Code Online (Sandbox Code Playgroud)
获取数据后文件会自动关闭吗?如果没有,我怎么能关闭它,因为fdata不是句柄?
谢谢
关于以下代码:
#include <stdio.h>
int lastval(void)
{
`static int k = 0;
return k++;
}
int main(void)
{
int i = 0;
printf("I previously said %d\n", lastval());
i++;
i++;
i++;
i++;
i++;
printf("I previously said %d\n", lastval());
i++;
i++;
i++;
printf("I previously said %d\n", lastval());
i++;
i++;
i++;
printf("I previously said %d", lastval());
i++;
i++;
i++;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释静态如何保持其价值?我虽然这是因为函数的堆栈框架在返回后没有被销毁,所以我编写了这个代码在gdb下运行它,然后我在每一行之后做回溯,只有main的堆栈框架显示出来(当我做的时候它甚至没有列出lastval坐在printf电话上的回溯,但无论如何).
它的k实际如何存储?我知道这不像普通变量,因为第一个k ++返回1而不是0,并且它不像全局,因为我无法访问main中的k,例如,那么......发生了什么?
`在本地k上,K ++ //总是返回0
`在全局k = 0,k ++ //返回0,1,2
`在静态k上,k ++ //返回1,2,3
任何人都可以帮助我理解这两个问题吗?