代码之家  ›  专栏  ›  技术社区  ›  Kominops

C增量++意外结果

  •  0
  • Kominops  · 技术社区  · 1 周前

    在尝试增加int变量的值时,我遇到了使用increment++的问题。我将名为records的变量的地址传递给函数open(),然后以二进制模式打开文件,然后解析文件以查找文件中存在的结构记录元素的数量。问题是,当使用增量++作为 *records++; 结果不是预期的,例如,我在.dat文件中有4条记录,它会打印:

    HELLO! 1
    HELLO! 0
    HELLO! -251258176
    HELLO! 22074
    

    总的来说,它打印:

    Records in file: 0.
    

    现在奇怪的是,我没有使用增量++,而是使用 *records += 1; ,结果不出所料!

    HELLO! 1
    HELLO! 2
    HELLO! 3
    HELLO! 4
    

    总的来说:

    Records in file: 4.
    

    我不明白问题出在哪里。部分代码包含在下面:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define true 1
    #define false 0
    #define size 100
    
    typedef struct record {
        char firstName[size], lastName[size];
        int age;
        double grade;
    } record;
    
    int open(const char *filename, FILE **fp, int *records);
    
    int main() {
        FILE *fp;
        char filename[] = "records.dat";
        int records = 0, opened = false, ch = 1;
    
        while(ch > 0 && ch < 5) {
    
            printf("Select your choice from the list below: \n");
            printf("1. Open file and get amount of records in it\n");
            printf("Enter your choice: ");
            scanf("%d", &ch);
            while(getchar() != '\n');
    
            switch(ch) {
                case 1:
                    if(opened) {
                        printf("\nFile already open, try closing it first please.\n");
                        break;
                    }
    
                    opened = open(filename, &fp, &records);
    
                    if(opened) {
                        printf("\nRecords in file: %d.\n", records);
                    } else { // Failed to open AND create file
                        return 1;
                    }
    
                    break;
    
                default:
                    printf("\nGoodbye!\n");
                    if(opened) {
                        fclose(fp);
                    }
                    return 0;
                    break;
            }
        }
    }
    
    int open(const char *filename, FILE **fp, int *records) {
        char temp[size];
        record r;
        *records = 0;
    
        printf("Attempting to open file...\n");
        *fp = fopen(filename, "rb+");
        if(*fp == NULL) {
            printf("File doesn't exit, attempting to create file...\n");
            *fp = fopen(filename, "wb+");
            if(*fp == NULL) {
                fprintf(stderr, "Couldn't open neither create %s, exiting...\n", filename);
                return false;
            }
            printf("File created.\n");
            return true;
        }
        printf("File found!\n");
    
        while(fread(&r, sizeof(r), 1, *fp) == 1) {
            *records++;
            //*records += 1;
            printf("HELLO! %d\n", *records);
        }
    
        return true;
    }
    
    2 回复  |  直到 1 周前
        1
  •  0
  •   PaulProgrammer    1 周前

    这个 ++ (增量)绑定得比 * (取消引用)。基本上,您所做的是更改指针,而不是值。它相当于:

    *(records+=1);
    

    尝试 (*records)++ 而是强制先取消引用。

    但大多数情况下,不要这样修改参数,而是将其作为一个返回值:

    int open(...) {
      int records=-1;
      while( read ...) {
        // do stuff
        records++;
      }
      return records;
    }
    

    和使用 -1 意思是“错误”。

    或者,如果必须修改参数:

    int open(..., int* records) {
       int records_read = 0;
       while( read ... ) {
         // do stuff
         records_read++;
       }
       *records = records_read;
       return true;
    }
    
        2
  •  0
  •   Egemen Yalın    1 周前

    这是因为 优先事项 的运算符“++”的优先级高于“*”,但“+=”的优先级低于“*”

    你必须这样做 (*records)++

    *records++ == *(records++)

    以下是操作员优先级列表: https://en.cppreference.com/w/c/language/operator_precedence