在同一个 printf 中使用多个 fgetc 时的反转结果

inverted results when using many fgetc inside the same printf

我有一个 archivo3.txt 和 "ABCDEFGHI" 的文件,我虽然 fgetc 分开读取了前 3 个字符(不同 printf)并且工作正常(41、42、显示了 43 个),当我尝试做同样的事情但只使用一个 printf 时,问题就来了。

在这种情况下,值从右到左显示 (43,42,41)。有人知道会发生什么吗?

我的代码是:

#include<stdio.h>
#include<stdlib.h>

int main(){

  FILE*app_f=fopen("archivo3.txt", "rb");
  if(app_f==NULL){
    printf("error al abrir el archivo");
    exit(1);
  }else{
  fseek(app_f,0, SEEK_SET);
  printf("caracteres %02X\n", fgetc(app_f));
  printf("caracteres %02X\n", fgetc(app_f));
  printf("caracteres %02X\n", fgetc(app_f));
  printf("\n--------------\n");
  fseek(app_f,0, SEEK_SET);
  printf("caracter %02X, %02X, %02X\n", fgetc(app_f), fgetc(app_f), fgetc(app_f));
  }
  return 0;
}

参数的计算顺序未在任何标准中定义,因此可能因编译器而异。看起来您的编译器正在从最后到第一个而不是相反的方式评估表达式。另一个编译器可能会以不同的顺序执行此操作。

因此,最安全的做法是不要假定 printf 参数的求值顺序,并相应地编写代码。请参阅下面的代码段。

有关详细信息,请参阅 this more thorough question

#include<stdio.h>
#include<stdlib.h>

int main(){
  chars = char[3];

  FILE*app_f=fopen("archivo3.txt", "rb");
  if(app_f==NULL){
    printf("error al abrir el archivo");
    exit(1);
  }else{
  fseek(app_f,0, SEEK_SET);
  chars[0] = fgetc(app_f);
  chars[1] = fgetc(app_f);
  chars[2] = fgetc(app_f);
  printf("caracteres %02X\n", chars[0]);
  printf("caracteres %02X\n", chars[1]);
  printf("caracteres %02X\n", chars[2]);
  printf("\n--------------\n");
  fseek(app_f,0, SEEK_SET);
  printf("caracter %02X, %02X, %02X\n", chars[0], chars[1], chars[2]);
  }
  return 0;
}