【问题标题】:Parameter passing in C/C++ [duplicate]C/C++中的参数传递[重复]
【发布时间】:2013-05-06 04:42:42
【问题描述】:

我有两个问题。

第一季度: 以下程序会输出什么(在 32 位 little-endian 机器上):

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

为什么?

第二季度:

为什么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;
}

【问题讨论】:

  • 如果将第一个和第三个设置为默认值,当我给它两个参数时,你希望它做什么?至于其他一切,只是未定义的行为。
  • @chris 但是为什么我不能只将第一个参数设置为默认值?
  • 阅读函数重载。你可以用它做你想做的事。
  • 你可以有不同的函数,名字相同但输入不同。因此,如果在您的第​​一个函数中,c 是常量,请将其从输入列表中删除并将 c = 1 放在函数的第一行。
  • 如果你有三个问题,你为什么不发三个帖子?每个帖子一个问题。

标签: c++ c parameter-passing optional-parameters


【解决方案1】:

对于 Q1:由于经验法则是所有默认参数都应该在右侧,func(int a = 1, int b, int c) 违反了规则,因为 a =1。它将显示错误,因为如果我们编写 func(5,6),编译器将无法理解 5 将分配给 ab。调用函数时,参数从左到右分配。这是基础。

同样对于func(int a = 1, int b, int c = 3),如果我们调用func(7),编译器会尝试将7 分配给a,但是对于b 则没有。所以这也会导致错误。

【讨论】:

    【解决方案2】:

    这只是对 Q3 的回答。

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

    当您看到正确的代码时,这一切都会变得更加清晰。因为您正在传递long long 参数,所以您需要指定正确的长度子说明符(在这种情况下为“ll”):

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

    注意“ll”这告诉 printf 参数有多大,在您的情况下,它们是您传递的计划“%d”的两倍(在大多数当前硬件上)。

    【讨论】:

      猜你喜欢
      • 2014-11-07
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2011-04-07
      • 1970-01-01
      • 2013-07-24
      相关资源
      最近更新 更多