This question already has an answer here:
Prefix increment variable when variable is reused in parameter list [duplicate]

(1个答案)


4年前关闭。




使用 GCC 进行编译时,Prefix Increment运算符不会在对printf()的调用中发送变量(x)的增量值。

这是我的代码;
#include <stdio.h>

int bitcount(unsigned);

int main()
{
    unsigned int x = 127;

    printf("bitcount[%d] : %d\n", x, bitcount(x));
    printf("bitcount[%d] : %d\n", ++x, bitcount(x));

    return 0;
}

int bitcount(unsigned int x)
{
    int bitcount = 0;
    for(; x != 0; x >>= 1)
        if( x & 1 )
            bitcount++;

    return bitcount;
}

在main()方法中,问题在下面的行;
printf("bitcount[%d] : %d\n", ++x, bitcount(x));

X应该增加,并以增加后的x值发送到bitcount()。 x的值是递增的,但是,不是将值递增,而是将旧值发送到bitcount()函数。

我用MS VS尝试过同样的事情,这种行为没有发生。输出如下:

在Windows 10上使用GCC编译的程序的输出
D:\C\chapter2>gcc bitcount.c -o bitcount.exe

D:\C\chapter2>bitcount
bitcount[127] : 7
bitcount[128] : 7

在Windows 10上使用MS VS编译的程序的输出
bitcount[127] : 7
bitcount[128] : 1

为了确保该问题,我更新了代码以查看发送到该函数的值。

位计数V2
#include <stdio.h>

int bitcount(unsigned);

int main()
{
    unsigned int x = 127;

    printf("bitcount[%d] : %d\n", x, bitcount(x));
    printf("bitcount[%d] : %d\n", ++x, bitcount(x));

    return 0;
}

int bitcount(unsigned int x)
{
    printf("\nDebug::\tbitcount()::x=%d\n", x);
    int bitcount = 0;
    for(; x != 0; x >>= 1)
        if( x & 1 )
            bitcount++;

    return bitcount;
}

在Windows 10系统上使用GCC编译的Bitcount v2的输出

调试:: bitcount():: x = 127
位计数[127]:7

调试:: bitcount():: x = 127
位计数[128]:7

显而易见,GCC将X的旧值发送到bitcount()函数。

为了概括这个问题,我在下面编写了程序。

InsideFunc.c
#include <stdio.h>

int func(unsigned);

int main()
{
    unsigned int x = 127;

    printf("x: %d, func(): %d\n",   x, func(x));
    printf("x: %d, func(): %d\n", ++x, func(x));

    return 0;
}

int func(unsigned x)
{
    printf("\n\tDebug::func()::x=%d\n", x);

    return x;
}

在Windows 10系统上使用GCC编译的输出

D:\ C \ chapter2> gcc InsideFunc.c -o InsideFunc.exe

D:\ C \ chapter2> InsideFunc
    Debug::func()::x=127

x:127,func():127
    Debug::func()::x=127

x:128,func():127

同样,变量的值增加但旧值发送到函数。

这是我的gcc版本;
D:\C\chapter2>gcc --version
gcc (GCC) 5.2.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

有任何想法吗 ?

后记:我刚刚在上看到过。 Kernighan&Ritchie 的C编程语言本书,第49页,它解释了函数参数中求值的顺序是不确定的,并且取决于编译器;

最佳答案

函数调用参数的求值顺序在C++中未指定,因此在线:
printf("bitcount[%d] : %d\n", ++x, bitcount(x));
不能保证在++x之前先评估bitcount(x),因此可以将bitcount传递给x预先递增。您所有的编译器都有不同的但有效的(即符合标准的)行为。

关于c++ - 将值传递给函数时,GCC前缀增量运算符的行为异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36766590/

10-14 05:30