【问题标题】:C fgetc weird behavior when simultaneously used as parameter to same functionC fgetc 同时用作同一函数的参数时的奇怪行为
【发布时间】:2017-04-23 05:52:13
【问题描述】:

我正在使用 fgetc 从文本文件中读取和验证流,一次一个字符,但由于某种原因,它会重新排序字符。文本文件包含类似“abc”的内容

void newFunction(int i, int j, int k);

int main()
{
    FILE *fp;
    /...opens text file.../
    newFunction(fgetc(fp), fgetc(fp), fgetc(fp));
}

void newFunction(int i, int j, int k)
{
    printf("%d %d %d", i, j, k,);
}

我期待a b c,但为什么我的代码给出c b a

【问题讨论】:

  • 未定义参数的评估顺序。
  • @Someprogrammerdude 你的意思是优先级?我会尝试用括号括起来。
  • Operator 优先级与此无关。很简单,可以按任何顺序评估参数。您将不知道将首先调用哪个fgetc 电话。请阅读例如this evaluation order reference 了解更多信息。
  • 不,@Someprogrammerdude 意味着您无法预测哪个fgetc() 将首先被评估。此外,像这样“缩短”代码是一种糟糕的做法,而且它对给定的输入文件过于具体,你不应该编写一个程序来处理给定的输入文件,一个“文件格式”更合适,在这种情况下,我推荐一个数组,char abc[3]fread() 也许?

标签: c fgetc


【解决方案1】:
void newFunction(int i, int j, int k);

int main()
{
    FILE *fp;
    /...opens text file.../
    int i = fgetc(fp);
    int j = fgetc(fp);
    int k = fgetc(fp);
    newFunction(i,j,k);
}

void newFunction(int i, int j, int k)
{
    printf("%d %d %d", i, j, k);
}

您可以执行上述操作以避免在评估参数时产生歧义。

【讨论】:

  • 是的。它还有助于维护必须调试、维护或增强代码的任何人的理智。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
相关资源
最近更新 更多