小编SJP*_*PRO的帖子

C /函数调用中的序列点

我只是学习一些C,或者更确切地说,了解一些神秘的细节.我正在使用VTC高级C编程,其中我发现序列点是:

  • 分号
  • 逗号
  • 逻辑OR/AND
  • 三元运算符
  • 函数调用(用作函数调用的参数的任何表达式在调用完成时完成)

这些都是正确的吗?关于我试过的最后一个:

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.

先感谢您.请考虑我来自南美洲所以,如果我不清楚或没有任何意义,请哦,拜托,告诉我.

最热烈的问候,塞巴斯蒂安.

c

5
推荐指数
2
解决办法
247
查看次数

fscanf是否分配内存并在字符串末尾放置一个NUL字节?

如果我是正确的,做一些像:

char *line;
Run Code Online (Sandbox Code Playgroud)

然后我必须分配一些内存并将其分配给线路,是吗?如果我是对的,问题如下:

在一条线上

while (fscanf(fp,"%[^\n]", line) == 1) { ... } 
Run Code Online (Sandbox Code Playgroud)

没有为行分配任何内存我仍然得到正确的行和这些行上正确的strlen计数.

那么,fscanf为我分配那个记忆,它还放置了'\0'吗?我在规范中没有提到这两件事fscanf.

c scanf

4
推荐指数
2
解决办法
728
查看次数

在这种情况下需要关闭文件吗?

如果我有:

fdata = open(pathf, "r").read().splitlines()
Run Code Online (Sandbox Code Playgroud)

获取数据后文件会自动关闭吗?如果没有,我怎么能关闭它,因为fdata不是句柄?

谢谢

python file

4
推荐指数
1
解决办法
79
查看次数

函数调用中的static关键字

关于以下代码:

#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

任何人都可以帮助我理解这两个问题吗?

c

-1
推荐指数
1
解决办法
158
查看次数

标签 统计

c ×3

file ×1

python ×1

scanf ×1