前缀增量运算符在使用 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尝试过同样的事情,这种行为不端没有发生。产出如下;
D:\C\chapter2>gcc bitcount.c -o bitcount.exe
D:\C\chapter2>bitcount
bitcount[127] : 7
bitcount[128] : 7
bitcount[127] : 7
bitcount[128] : 1
为了确保问题,我更新了代码以查看发送给函数的值;
#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;
}
Debug :: bitcount():: x = 127 bitcount [127]:7
Debug :: bitcount():: x = 127 bitcount [128]:7
很明显,GCC将旧的X值发送给bitcount()函数。
为了概括这个问题,我编写了以下程序;
#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;
}
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));
答案 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));