C 语言学习笔记 04 - 数据类型、变量、运算符、语句

数据类型

整型 (int)

  • 分为 short int int long int,以及喜闻乐见的 long long

  • 存在 short int < int < long int < long long

C 语言与较新的语言不同,提供了不同类型的整型方便你分配,而非普通的 int long 等。

在不同操作系统或不同编译器下,整型的大小不同,C 语言标准只约束了其最小位数。一般地,下列类型也是如此。

对应的,还有无符号整型,即最小值为 0 的整型。只需在数据类型前加上 unsigned 就会变成无符号整型,如 unsigned int

特殊的,在不同平台中存在 size_t 这一类型,对于 mingw 为 __int64。

字符 (char)

  • 为 ASCII 字符集,本质上为整数类型 (即可以 char i = 1;)

  • 可以使用转义符号 '\+八进制数字' 表示

存在以下特殊符号

  • \n newline 换行

  • \b backspace

  • \r return

  • \t table 制表符

对于东亚字符所需的 (Unicode) 使用字符表示,使用 wchar_t,且在字符变量前加上 L

wchar_t cnChar = L'你好世界';,通常称为宽字符,在 C95 后引入。

字符串则使用双引号,如 char *string = "字符串";

同样的,对于 Unicode 也存在转义符号形式,如 wchar_t unicode = L'\u4E2D';

浮点型

  • 存在 floatdouble 两种形式,分别为单精度和双精度。

  • float (±10^37, 六位有效数字),double (-1.0E37-1.0E+37,15~16位有效数字)

例如表示北京的纬度

#include <stdio.h>

int main() {
    float lati = 39.90815f;

    printf("%f", lati);
    printf("\n");
    printf("%f", 39.908156f - lati);

    return 0;
}

得到结果

C:\Users\NatsuYuki\CLionProjects\untitled\cmake-build-debug\untitled.exe
39.908150
0.000008
Process finished with exit code 0

相减的结果与我们的常识显然不符。这是因为 float 的有效位只有六位,后面位数均为非精确位,运算中存在精度损失。

变量与内存地址

关于变量的概念不再多做阐述,此处仅介绍内存地址。

使用 sizeof(var) 查询该变量的大小、&var 取变量的内存地址。内存地址同样也是整数类型,且不唯一。

对于变量的命名,与 Java 所喜欢的驼峰式不同,在 C 语言中推荐你使用下划线分割变量名,例如 i_am_a_var

常量

在 C 语言中,在变量类型前添加 const 即可定义不可变变量。

虽然设计上不可变,但我们仍然可以通过指针操作这个变量,例如:

const int const_var = 1;
int *p_const_var = &const_var;
*p_const_var = 2;

有点类似于 Java 中通过反射修改常量的感觉,实际上 const 只是个只读变量,有权限时你依然可以修改它 (通过指针)。

无独有偶,C 语言中还存在除 const 外的常量设计——宏 (macro):

#define REAL_CONST_VAR 114514

printf("REAL_CONST_VAR: %d\n", REAL_CONST_VAR);

在编译时使用了宏的对应位置会被替换,实际上宏不是变量,它并不存在,因此你在代码中无法修改它。此外,在任意位置你也可以取消你所设置的宏:#undef REAL_CONST_VAR

最后,C 语言中还有字面量这一概念,可以称之为真正的常量,例如 3 3u 3l 3.14f 'c' "c 语言" 等。

运算符

在 C 语言中,一共有以下几种运算符:

赋值 (=)

int first = 0;
int second;
int third;

third = second = first; // output 0

数学运算

对于加减乘除,分别为 +-*/,取余数 %

i++ 改变自身值,不返回。++i 反之。

存在 +=-= 等运算赋值符。

逗号运算符 x = x * 2, x = x + 3;,不推荐使用。

条件控制与移位

  • & (按位与) 相同为 1,不同为 0.
  • | (按位或) 有 1 为 1,全 0 为 0.
  • ^ (按位异或) 不同为 1,相同为 0.
  • ~ 1 得 0,0 得 1.
  • << 左移位, >> 右移位.

三元运算符

与 Java 中一致:

bool is_new_season;
int person_count = is_new_season ? 9 : 5;

语句

switch 语句

与 Java 中大致一致:

switch (condition) {
    case 0:
        // do something
        break;
    case 1:
        // do something
        break;
    default: 
        // do something
}

循环语句

  • while 与 do while

与 Java 中一致:

while (condition) {}

do {
    // do something
} while (condition) {}
  • for

与 Java 中一致,例如:

for (int i; i < 5; i++) {
    // do something
}

同样的,也存在 continuebreak 语句。

goto 跳转

不推荐使用。

int i = 0;
begin:
printf("%d\n", i);
if (i++ < 5) {
    goto begin;
}
return 0;

下一节中,我们将介绍 C 语言的函数与程序结构。

comments powered by Disqus