Arguments

Operater

基本运算符

逻辑运算符

{% content-ref url="../library/iso646.h.md" %}
iso646.h.md

其他运算符

运算符优先级

运算符(优先级从高至低) 结合律
() 从左往右
- + ++ -- sizeof 从右往左
* / % 从左往右
+ - 从左往右
< > <= >= 从左往右
== != 从左往右
&& || 从右向左
= 从右往左

不要自作聪明

ans = num/2 + 5*(1 + num++);

编译器会自己选择先运算num/2还是5*(1 + num++)

所以不要写这样的代码!


Expression and Argument


类型转换

自动类型转换

总的原则是“小的”转化成“大的”。(这样有优点有缺点。rust 中就不允许这样转换)

Demo
/* convert.c -- automatic type conversions */
#include <stdio.h>
int main(void)
{
    char ch;
    int i;
    float fl;
    
    fl = i = ch = 'C';                                  /* line 9  */
    printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); /* line 10 */
    ch = ch + 1;                                        /* line 11 */
    i = fl + 2 * ch;                                    /* line 12 */
    fl = 2.0 * ch + i;                                  /* line 13 */
    printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); /* line 14 */
    ch = 1107;                                          /* line 15 */
    printf("Now ch = %c\n", ch);                        /* line 16 */
    ch = 80.89;                                         /* line 17 */
    printf("Now ch = %c\n", ch);                        /* line 18 */
    
    return 0;
}

// ch = C, i = 67, fl = 67.00
// ch = D, i = 203, fl = 339.00
// Now ch = S
// Now ch = P

强制类型转换

大转小也可以,但会发生“截断”

Demo
#include <stdio.h>

int main()
{
    // float 转换为 int
    float f = 123.456f;
    printf("原始 float 值: %f\n", f);
    printf("强制转换后的 int 值: %d\n", (int)f);

    // double 转换为 float
    double d = 123456789.123456789;
    printf("原始 double 值: %lf\n", d);
    printf("强制转换后的 float 值: %f\n", (float)d);

    // int 转换为 char
    int i = 256; // 256 超出了 char 的范围
    printf("原始 int 值: %d\n", i);
    printf("强制转换后的 char 值: %d\n", (char)i);

    return 0;
}
// 原始 float 值: 123.456001
// 强制转换后的 int 值: 123
// 原始 double 值: 123456789.123457
// 强制转换后的 float 值: 123456792.000000
// 原始 int 值: 256
// 强制转换后的 char 值: 0