2013-05-06 87 views
0

我在这里有两个问题。在C/C++中传递参数

Q1: 什么将下面的程序输出(32位小端机器上):

int main() 
{ 
    long long a = 0x1, b = 0x2, c = 0x3; 
    printf("a = %d, b = %d, c = %d.\n", a, b, c); 
    return 0; 
} 

,为什么?

Q2:

为什么的abc输出有什么不同?

void func(int a, int b, int c) 
{ 
    printf("a = %d, b = %d, c = %d.\n", a, b, c); 
} 
int main() 
{ 
    long long a = 0x1, b = 0x2, c = 0x3; 
    printf("a = %d, b = %d, c = %d.\n", a, b, c); 
    func(a, b, c); 
    return 0; 
} 
+2

如果您将第一个和第三个设置为默认值,那么当我给它两个参数时,您希望它执行什么操作?至于其他一切,只是未定义的行为。 – chris 2013-05-06 04:44:17

+0

@chris但为什么我不能只将第一个参数设置为默认值? – imsrch 2013-05-06 04:46:20

+0

阅读关于函数重载。你可以用它做你想做的。 – 2013-05-06 04:48:08

回答

0

对于Q1:由于拇指规则是,所有默认Pramaeters应在右手边,func(int a = 1, int b, int c) voilates因为一个= 1的规则。它会显示错误,因为如果我们编写func(5,6),编译器不会理解5将被分配给ab。在调用功能时,参数从左向右分配。这是基本的基础。

Simlarily for func(int a = 1, int b, int c = 3)如果我们调用func(7),编译器会尝试将7分配给a,但b没有任何内容。所以这也会导致错误。

0

这仅适用于Q3。

简单的答案是printf不是类型安全的。格式字符串被解析,并且基于遇到的说明符,printf函数从可变参数列表中提取适当大小的数据。

当你看到正确的代码时,这一切变得更加清晰。由于您所传递long long参数需要指定正确的长度子符(INT这种情况下,“LL”):

printf("a = %lld, b = %lld, c = %lld.\n", a, b, c); 

注意“LL”这告诉printf的有多大的参数是和你的情况下,他们是您通过的计划“%d”的两倍(在目前的大多数硬件上)。