当前位置:  开发笔记 > 编程语言 > 正文

const int与int const作为C++和C中的函数参数

如何解决《constint与intconst作为C++和C中的函数参数》经验,为你挑选了5个好方法。

快速提问:

int testfunc1 (const int a)
{
  return a;
}

int testfunc2 (int const a)
{
  return a;
}

这两个功能在每个方面都是相同的还是有区别的?我对C语言的答案感兴趣,但如果C++语言中有一些有趣的东西,我也想知道.



1> Ates Goral..:

诀窍是向后阅读声明(从右到左):

const int a = 1; // read as "a is an integer which is constant"
int const a = 1; // read as "a is a constant integer"

两者都是一回事.因此:

a = 2; // Can't do because a is constant

当您处理更复杂的声明时,阅读向后技巧尤其会派上用场,例如:

const char *s;      // read as "s is a pointer to a char that is constant"
char c;
char *const t = &c; // read as "t is a constant pointer to a char"

*s = 'A'; // Can't do because the char is constant
s++;      // Can do because the pointer isn't constant
*t = 'A'; // Can do because the char isn't constant
t++;      // Can't do because the pointer is constant


这是一个非常强大的教学技巧 - 干得好
@PanayiotisKarabassis所有人都应该被视为一系列形容词,而不是交换任何地方.`char const*`,从左到右读取:"指针,const,char".它是一个指向const char的指针.当你说"一个恒定的指针"时,"常量"形容词位于指针上.因此,对于这种情况,你的形容词列表应该真的是:"const,pointer,char".但你是对的,这个伎俩很模糊.这真的是一个"诡计",不仅仅是一个明确的"规则".
当你声明数组,函数,指针和函数指针的狂野组合时,向后读取不再起作用(遗憾的是).但是,您可以在[螺旋模式](http://c-faq.com/decl/spiral.anderson.html)中阅读这些杂乱的声明.其他人对他们感到非常沮丧,他们发明了Go.
那“ char const * u”呢?这是“指向常量字符的指针”还是“指向常量字符的指针”?似乎模棱两可。该标准说的是前者,但是要找出答案,您必须考虑优先级和关联性规则。
@PanayiotisKarabassis你想从右到左书写.:)

2> Konrad Rudol..:

const T并且T const完全相同.使用指针类型会变得更复杂:

    const char* 是一个指向常量的指针 char

    char const* 是一个指向常量的指针 char

    char* const 是一个指向(可变)的常量指针 char

换句话说,(1)和(2)是相同的.制作指针(而不是指针)的唯一方法const是使用后缀 - const.

这就是为什么许多人更喜欢总是放在const类型的右侧("东方const"风格):它使其位置相对于类型一致且易于记忆(它也传闻似乎更容易教给初学者).


K&R C没有常数; C90(和C99)呢.与C++相比,它有点受限,但它很有用.
C确实有const,给定:static const char foo [] ="foo"; 你最好不要改变foo.

3> Andru Luvisi..:

没有区别.它们都声明"a"是一个无法更改的整数.

差异开始出现的地方是使用指针时.

这两个:

const int *a
int const *a

声明"a"是指向不改变的整数的指针."a"可以分配给,但"*a"不能分配.

int * const a

声明"a"是一个指向整数的常量指针."*a"可以分配给,但"a"不能分配.

const int * const a

将"a"声明为常量整数的常量指针."a"和"*a"都不能分配给.

static int one = 1;

int testfunc3 (const int *a)
{
  *a = 1; /* Error */
  a = &one;
  return *a;
}

int testfunc4 (int * const a)
{
  *a = 1;
  a = &one; /* Error */
  return *a;
}

int testfunc5 (const int * const a)
{
  *a = 1;   /* Error */
  a = &one; /* Error */
  return *a;
}



4> Fred Larson..:

Prakash是正确的,声明是相同的,虽然指针案例的更多解释可能是有序的.

"const int*p"是指向int的指针,该int不允许通过该指针更改int."int*const p"是指向无法更改为指向另一个int的int的指针.

请参阅http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.5.



5> Emerick Rogu..:

const intint constC中的所有标量类型都是一样的.通常,const不需要声明标量函数参数,因为C的值调用语义意味着对变量的任何更改都是其封闭函数的局部变量.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有