将值传递给函数

时间:2016-04-21 10:17:03

标签: c++ c gcc mingw prefix-operator

前缀增量运算符在使用 GCC 编译时,在调用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

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

Bitcount 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的输出

Debug :: bitcount():: x = 127 bitcount [127]:7

Debug :: bitcount():: x = 127 bitcount [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&gt; gcc InsideFunc.c -o InsideFunc.exe

d:\ C \第二章&GT; 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&amp ;;的 The C Programming Language 一书。 Ritchie ,第49页解释函数参数中的评估顺序是不确定的并且依赖于编译器;

  

类似地,评估函数参数的顺序不是   指定,所以声明

     

printf("%d %d\n", ++n, power(2, n)); /*WRONG */

     

可以根据不同的编译器产生不同的结果   是否在调用电源之前递增n。解决方案   当然是写

     

++n;

     

printf("%d %d\n", n, power(2, n));

2 个答案:

答案 0 :(得分:1)

函数调用参数的评估顺序在C ++中未指定,因此在线:

BaseViewHolder

无法保证在RecyclerView.ViewHolder之前评估printf("bitcount[%d] : %d\n", ++x, bitcount(x));,因此++x可以通过bitcount(x)预先递增。所有编译器都有不同但有效(即标准兼容)的行为。

答案 1 :(得分:1)

不要在表达式中使用增量:

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