我听说在声明之前访问let和const值可能会导致一个ReferenceError因为有些东西叫做时间盲区 。 什么是暂时的死亡地带,它是如何涉及范围和提升,在什么情况下遇到?
即使在使用大量-Wall -W -pedantic -std=c99选项( -Wall -W -pedantic -std=c99 )时,GCC和Clang也不会抱怨,如果我将string文字分配给char* char *foo = "bar"; 而他们(当然),如果我分配一个const char* char*来做抱怨。 这是否意味着string文字被认为是char*types? 他们不应该是const char*吗? 如果他们被修改,它没有被定义的行为! 和(一个不相关的问题)命令行参数(即: argv ):它被认为是一个string文字数组?
要开始你可能知道const可以用来使对象的数据或指针不可修改或两者兼而有之。 const Object* obj; // can't change data Object* const obj; // can't change pointer const Object* const obj; // can't change data or pointer 但是,您也可以使用以下语法: Object const *obj; // same as const Object* obj; 似乎唯一重要的是你把const关键字放在星号的哪一边。 就我个人而言,我更喜欢把const放在types的左边来指定它的数据是不可修改的,因为我发现它从左到右的思维模式读得更好,但是哪个语法最先? 更重要的是,为什么有两种正确的方式来指定const数据,在什么情况下你会喜欢还是需要一个呢? 编辑: 所以这听起来像是一个随意的决定,编译器如何解释事物的标准早在我出生之前就已经起草了。 由于const被应用于关键字左侧的内容(默认情况下),我想他们认为添加“快捷方式”来应用关键字并以其他方式input限定符是没有害处的,至less在声明发生变化之前通过parsing一个*或… 这是C的情况,以及我假设?
作为一名新手C ++程序员,有一些对我来说看起来还是很模糊的构造,其中一个是const 。 你可以在很多地方使用它,并有许多不同的效果,初学者几乎不可能活着出来。 一些C ++大师会一次解释一下各种用法和/或为什么不使用它们?
指向非const数据的指针可以隐式转换为指向相同types的const数据的指针: int *x = NULL; int const *y = x; 添加额外的const限定符以匹配额外的间接参数应该在逻辑上以相同的方式工作: int * *x = NULL; int *const *y = x; /* okay */ int const *const *z = y; /* warning */ 然而,用GCC或Clang编译这个与-Wall标志,会导致以下警告: test.c:4:23: warning: initializing 'int const *const *' with an expression of type 'int *const *' discards qualifiers in nested pointer types […]
以下声明有什么区别? char * const a; const char * a; 为了理解我写的这个小程序的区别: #include <stdio.h> #include <stdlib.h> int main (int argc, char **argv) { char a = 'x'; char b = 'y'; char * const pc1 = &a; const char * pc2 = &a; printf ("Before\n"); printf ("pc1=%p\n", pc1); printf ("*pc1=%c\n", *pc1); printf ("pc2=%p\n", pc2); printf ("*pc2=%c\n", *pc2); […]
那么为什么它总是推荐尽可能经常使用const? 在我看来,使用const比在C ++中的帮助更加痛苦。 但是再次,我从python的angular度来看这个问题:如果你不想改变某些东西,不要改变它。 所以说,这里有几个问题: 这似乎是每次我标记为const的东西,我得到一个错误,不得不改变一些其他函数的地方是常量。 然后这导致我不得不在其他地方改变另一个function。 这是什么东西,随着经验变得更容易? 使用const的好处真的足以弥补麻烦吗? 如果你不打算改变一个对象,为什么不写一些不改变它的代码呢? 我应该注意到,在这个时候,我最关注的是使用const来实现正确性和可维护性的好处,但是对性能的影响也是很好的。
将指向非const的指针转换成指向const的指针是合法的。 那么为什么把一个指针指向非const的指针转换为指向const的指针是不合法的呢? 例如,为什么下面的代码是非法的: char *s1 = 0; const char *s2 = s1; // OK… char *a[MAX]; // aka char ** const char **ps = a; // error!
你用const去多远? 你是否只是在必要时使函数成为const ,或者你是否全力以赴地使用它? 例如,设想一个简单的使用单个布尔参数的增变器: void SetValue(const bool b) { my_val_ = b; } 那个const实际上有用吗? 我个人select广泛使用它,包括参数,但在这种情况下,我想知道它是否值得? 我也惊讶地发现,你可以在函数声明中忽略const的参数,但是可以将它包含在函数定义中,例如: .h文件 void func(int n, long l); .cpp文件 void func(const int n, const long l) 这是有原因吗? 这对我来说似乎有点不寻常。
我一直在玩ES6一段时间,我注意到,虽然用var声明的variables是如预期的那样悬挂着… console.log(typeof name); // undefined var name = "John"; …使用let或const声明的variables在提升时似乎有一些问题: console.log(typeof name); // ReferenceError let name = "John"; 和 console.log(typeof name); // ReferenceError const name = "John"; 这是否意味着使用let或const声明的variables不会被挂起? 这里究竟发生了什么? let和const在这个问题上有什么区别吗?