Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该更改函数参数的值吗?_C++_C_Function_Parameters - Fatal编程技术网

C++ 我应该更改函数参数的值吗?

C++ 我应该更改函数参数的值吗?,c++,c,function,parameters,C++,C,Function,Parameters,我知道这在C中是允许的,但我习惯于不更新通过value传递的变量的值 在我的“编码风格”中,通过值传递的参数不会更改。 我的意思是我更喜欢这个: void func(int var) { int locVar = var; if(something) { locVar = locVar/2; } // [some stuff using locVar] } 在这方面: void func(int var) { if(somet

我知道这在C中是允许的,但我习惯于不更新通过value传递的变量的值

在我的“编码风格”中,通过值传递的参数不会更改。 我的意思是我更喜欢这个:

void func(int var)
{
    int locVar = var;

    if(something)
    {
        locVar = locVar/2;
    }

    // [some stuff using locVar]
}
在这方面:

void func(int var)
{
    if(something)
    {
        var = var/2;
    }

    // [some stuff using var]
}

我假设如果启用寄存器优化,编译器将不会生成不同的程序集,但是,是否有充分的理由选择这两个代码段中的一个?

通常,引入的变量越多,代码的可读性越差,代码越复杂

有时甚至很难为一个实体创造两个语义相同的名称

例如,一个函数列表可以占用多个屏幕。在这种情况下,如果遇到类似
locVar
的名称,则需要向后滚动函数列表以确定该名称的含义

此外,一个函数可以有多个参数。是否要为每个参数引入新别名

对于代码的读者来说,不清楚您是否仅仅为了支持您的编码风格而引入了新的局部变量。例如,他们可能认为您更改了函数,忘记删除不再需要的变量。:)

例如,考虑一个递归函数,它计算一个数字的位数之和

unsigned int sum( unsigned int x )
{
    const unsigned int Base = 10;

    unsigned int digit = x % Base;
    return digit + ( ( x /= Base ) == 0 ? 0 : sum( x ) );
                        ^^^^^^^^^^^^^
} 
或者可以这样写

unsigned int sum( unsigned int x )
{
    const unsigned int Base = 10;

    return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
} 
在此函数中引入新局部变量作为
x
别名的目的是什么

unsigned int sum( unsigned int x )
{
    const unsigned int Base = 10;

    unsigned int y = x;
    unsigned int digit = y % Base;
    return digit + ( ( y /= Base ) == 0 ? 0 : sum( y ) );
} 
对于我来说,没有中间变量
y
的第一个函数实现更清晰。当使用相同的变量
x
时,函数的递归性质更为明显

如果要指出函数中的参数未更改,可以使用具有限定符const的参数声明或定义函数

比如说

unsigned int sum( const unsigned int x )
{
    const unsigned int Base = 10;

    return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
} 
< C++函数调用>看起来像

#include <iostream>

constexpr unsigned int sum( const unsigned int x )
{
    const unsigned int Base = 10;

    return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
} 

int main()
{
    std::cout << sum( 123456789 ) << std::endl;
    int a[sum( 123456789 )];

    std::cout << sizeof( a ) << std::endl;
}    

一般来说,引入的变量越多,代码的可读性就越差,也越复杂

有时甚至很难为一个实体创造两个语义相同的名称

例如,一个函数列表可以占用多个屏幕。在这种情况下,如果遇到类似
locVar
的名称,则需要向后滚动函数列表以确定该名称的含义

此外,一个函数可以有多个参数。是否要为每个参数引入新别名

对于代码的读者来说,不清楚您是否仅仅为了支持您的编码风格而引入了新的局部变量。例如,他们可能认为您更改了函数,忘记删除不再需要的变量。:)

例如,考虑一个递归函数,它计算一个数字的位数之和

unsigned int sum( unsigned int x )
{
    const unsigned int Base = 10;

    unsigned int digit = x % Base;
    return digit + ( ( x /= Base ) == 0 ? 0 : sum( x ) );
                        ^^^^^^^^^^^^^
} 
或者可以这样写

unsigned int sum( unsigned int x )
{
    const unsigned int Base = 10;

    return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
} 
在此函数中引入新局部变量作为
x
别名的目的是什么

unsigned int sum( unsigned int x )
{
    const unsigned int Base = 10;

    unsigned int y = x;
    unsigned int digit = y % Base;
    return digit + ( ( y /= Base ) == 0 ? 0 : sum( y ) );
} 
对于我来说,没有中间变量
y
的第一个函数实现更清晰。当使用相同的变量
x
时,函数的递归性质更为明显

如果要指出函数中的参数未更改,可以使用具有限定符const的参数声明或定义函数

比如说

unsigned int sum( const unsigned int x )
{
    const unsigned int Base = 10;

    return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
} 
< C++函数调用>看起来像

#include <iostream>

constexpr unsigned int sum( const unsigned int x )
{
    const unsigned int Base = 10;

    return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
} 

int main()
{
    std::cout << sum( 123456789 ) << std::endl;
    int a[sum( 123456789 )];

    std::cout << sizeof( a ) << std::endl;
}    
没有

  • 从计算机的角度来看——没有区别。优化将完成这项工作
  • 从个人角度来看,这是一个品味问题
  • 从元视图-不要设置陷阱
通常,函数中多次需要初始参数值,因此更常见的样式是不覆盖参数。在catch子句中提供用于调试、记录消息(“写入的n字节”)等的值非常方便。由于这或多或少是一种常见的样式,维护人员很容易错过您的itsy bitsy过早优化。这种优化在非优化C编译器时代很常见,现在它们只是“因为我能”的东西。记住,我们编写代码是为了让人类可读。编译器无论如何都可以这样做。

  • 从计算机的角度来看——没有区别。优化将完成这项工作
  • 从个人角度来看,这是一个品味问题
  • 从元视图-不要设置陷阱
通常,函数中多次需要初始参数值,因此更常见的样式是不覆盖参数。在catch子句中提供用于调试、记录消息(“写入的n字节”)等的值非常方便。由于这或多或少是一种常见的样式,维护人员很容易错过您的itsy bitsy过早优化。这种优化在非优化C编译器时代很常见,现在它们只是“因为我能”的东西。记住,我们编写代码是为了让人类可读。编译器无论如何都可以做到这一点

有什么好的理由选择这两段代码中的一段吗

1) 编译器不是平等创建的<代码>int locVar=var可以创建更快的代码。(在给定的应用程序中,我惊讶地发现这一点。)这是局部或微观优化,仅在某些情况下有用,当然,当使用其他选项或在另一台机器上编译时,可能会导致不同的性能

2) 越少越好。引入同义词,如
int locVar=var是需要理解和维护的更多代码和更多变量。通常这是没有帮助的

3) 这两个代码段都生成有效代码。所以这也是一个风格问题。如果您的编码小组对此有编码指南,那么最好遵循该指南,而不是因为琐碎的原因而有所不同

选择一个优于另一个的原因:是。强有力的理由:一般情况下没有。当对哪种方式有疑问时