nonocast / me

记录和分享技术的博客
http://nonocast.cn
MIT License
20 stars 0 forks source link

学习 C/C++ (Part 17: const) #284

Open nonocast opened 2 years ago

nonocast commented 2 years ago

const 修饰变量

ANSI C 通过const声明常量,常量在第一次赋值后不能再次修改,可以理解为只读,readonly。Swift中通过let定义常量。

const int x = 5;
x = 8;  // error: cannot assign to variable 'x' with const-qualified type 'const int'

const int num 虽然编译可以通过,但是没有意义,随机值。

const int num;
num = 1;    // error

clang打开-Wall

const int num; // warning: variable 'x' is uninitialized when used here 

Swift中就是通过let定义constant

let x = 5
x = 7 // error: Cannot assign to value 'x' is a 'let' constant

const 修饰数组

const int days[4] = {1, 2, 3, 4};
days[0] = 7; // error: cannot assign to variable 'days' with const-qualified type 'const int [4]'
const char name[] = "nonocast";
name[0] = 'a'; // error

char* name = "nonocast"时,编译器会将"nonocast"放在read-only的segment上,但还是建议加上const,如果不加在运行时修改会产生runtime fault error,加上const则会直接生成编译时错误。

const 修饰函数参数

在函数中声明为const的形参在函数被调用时会得到实参的值。

void bar(const int n) {
  printf("n: %d\n", n);
  n = 1; // error: cannot assign to variable 'n' with const-qualified type 'const int'
}

const 修饰指针

定义了一个指向const int的指针p,所以不能修改*p

const int *p = &x;
*p = 7; // error: read-only variable is not assignable
p = &y; // ok

定义一个只想int的常量指针p, *p可以被修改,但不能指向别人

int* const p = &x;
*p = 7; // ok
p = &y; // error: cannot assign to variable 'p' with const-qualified type 'int *const'

参考阅读