繁体   English   中英

C /函数调用中的序列点

[英]Sequence points in C / function calls

我只是学习一些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;

}

它没有打印1,根据VTC的人所说的,如果我说得对,它应该,对吧? 此外,函数中的这些parens是否与分组parens相同? (我的意思是,他们的优先权)。 也许是因为parens的优先级高于++,但我也尝试过foo((i ++)); 并得到了相同的结果。 只做foo(i = i + 1); 屈服1。

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

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

你的代码工作正常,它与序列点无关。 关键是postfix ++运算符返回非递增的值 (但仍然将变量递增1)。

基本上:

  • i++ - 将i递增1并返回先前的值
  • ++i -增量i由一个和增量后返回值

运算符的位置略微暗示了它的语义。

顺序意味着在调用foo之前评估i++

考虑这种情况( 我不打印bar ):

int i = 0;
void foo (int bar) { printf("i = %d\n", i); }
int main(void){
    foo(i++);
    return 0;
}

必须打印i = 1

C实现了按值传递语义。 首先评估i ++ ,并保留该值,然后修改i (这可能在评估和下一个序列点之间的任何时间发生),然后以备份值作为参数输入函数。

传递给函数的值总是与以任何其他方式使用参数表达式时看到的值相同。 其他行为相当令人惊讶,并且难以将常见的子表达式重构为函数。

当你做类似的事情:int i = 0,j;

j = i ++;

首先使用i的值然后递增。 因此,在您的情况下,使用i的值为0(因此传递给您的函数foo),然后递增。 i(现在为1)的递增值仅适用于main,因为它是本地变量。

如果你想打印1,请用这种方式调用foo:

FOO(++ⅰ);

这将打印1.休息你知道,为什么!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM