This question already has an answer here:
Prefix increment variable when variable is reused in parameter list [duplicate]
(1个答案)
4年前关闭。
使用 GCC 进行编译时,Prefix Increment运算符不会在对
这是我的代码;
在main()方法中,问题在下面的行;
X应该增加,并以增加后的x值发送到
我用MS VS尝试过同样的事情,这种行为没有发生。输出如下:
在Windows 10上使用GCC编译的程序的输出
在Windows 10上使用MS VS编译的程序的输出
为了确保该问题,我更新了代码以查看发送到该函数的值。
位计数V2
在Windows 10系统上使用GCC编译的Bitcount v2的输出
调试:: bitcount():: x = 127
位计数[127]:7
调试:: bitcount():: x = 127
位计数[128]:7
显而易见,GCC将X的旧值发送到bitcount()函数。
为了概括这个问题,我在下面编写了程序。
InsideFunc.c
在Windows 10系统上使用GCC编译的输出
D:\ C \ chapter2> gcc InsideFunc.c -o InsideFunc.exe
D:\ C \ chapter2> InsideFunc
x:127,func():127
x:128,func():127
同样,变量的值增加但旧值发送到函数。
这是我的gcc版本;
有任何想法吗 ?
后记:我刚刚在上看到过。 Kernighan&Ritchie 的C编程语言本书,第49页,它解释了函数参数中求值的顺序是不确定的,并且取决于编译器;
(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