算术运算符

基本算术

返回一个值,该值是使用相关的数学运算将左手操作数应用于右手操作数的结果。正交的换向数学规则适用(即加法和乘法是交换,减法,除法和模数不是)。

加法运算符

加法运算符(+)用于将两个操作数相加。例:

#include <stdio.h>

int main(void)
{
    int a = 5;
    int b = 7;

    int c = a + b; /* c now holds the value 12 */

    printf("%d + %d = %d",a,b,c); /* will output "5 + 7 = 12" */

    return 0;
}

减法运算符

减法运算符(-)用于从第一个减去第二个操作数。例:

#include <stdio.h>

int main(void)
{
    int a = 10;
    int b = 7;

    int c = a - b; /* c now holds the value 3 */

    printf("%d - %d = %d",a,b,c); /* will output "10 - 7 = 3" */

    return 0;
}

乘法运算符

乘法运算符(*)用于乘以两个操作数。例:

#include <stdio.h>

int main(void)
{    
    int a = 5;
    int b = 7;

    int c = a * b; /* c now holds the value 35 */

    printf("%d * %d = %d",a,b,c); /* will output "5 * 7 = 35" */

    return 0;
}

不要与* dereference 运算符混淆。

分部运算符

除法运算符(/)将第一个操作数除以第二个操作数。如果除法的两个操作数都是整数,它将返回一个整数值并丢弃余数(使用模运算符%来计算和获取余数)。

如果其中一个操作数是浮点值,则结果是该分数的近似值。

例:

#include <stdio.h>

int main (void)
{
    int a = 19 / 2 ; /* a holds value 9   */
    int b = 18 / 2 ; /* b holds value 9   */
    int c = 255 / 2; /* c holds value 127 */
    int d = 44 / 4 ; /* d holds value 11  */
    double e = 19 / 2.0 ; /* e holds value 9.5   */
    double f = 18.0 / 2 ; /* f holds value 9.0   */
    double g = 255 / 2.0; /* g holds value 127.5 */
    double h = 45.0 / 4 ; /* h holds value 11.25 */

    printf("19 / 2 = %d\n", a);    /* Will output "19 / 2 = 9"    */
    printf("18 / 2 = %d\n", b);    /* Will output "18 / 2 = 9"    */
    printf("255 / 2 = %d\n", c);   /* Will output "255 / 2 = 127" */
    printf("44 / 4 = %d\n", d);    /* Will output "44 / 4 = 11"   */
    printf("19 / 2.0 = %g\n", e);  /* Will output "19 / 2.0 = 9.5"    */
    printf("18.0 / 2 = %g\n", f);  /* Will output "18.0 / 2 = 9"      */
    printf("255 / 2.0 = %g\n", g); /* Will output "255 / 2.0 = 127.5" */
    printf("45.0 / 4 = %g\n", h);  /* Will output "45.0 / 4 = 11.25"  */

    return 0;
}

模数运算符

模运算符(%)仅接收整数操作数,并用于计算第一个操作数除以第二个操作数后的余数。例:

#include <stdio.h>

int main (void) {
    int a = 25 % 2;    /* a holds value 1  */
    int b = 24 % 2;    /* b holds value 0  */
    int c = 155 % 5;   /* c holds value 0  */
    int d = 49 % 25;   /* d holds value 24 */

    printf("25 % 2 = %d\n", a);     /* Will output "25 % 2 = 1"    */
    printf("24 % 2 = %d\n", b);     /* Will output "24 % 2 = 0"    */
    printf("155 % 5 = %d\n", c);    /* Will output "155 % 5 = 0"   */
    printf("49 % 25 = %d\n", d);    /* Will output "49 % 25 = 24"  */

    return 0;
}

增量/减量运算符

增量(a++)和减量(a--)运算符的不同之处在于它们在没有赋值运算符的情况下更改应用它们的变量的值。你可以在变量之前或之后使用递增和递减运算符。操作符的放置将值的递增/递减的定时更改为在将其赋值给变量之前或之后。例:

#include <stdio.h>

int main(void)
{
    int a = 1;
    int b = 4;
    int c = 1;
    int d = 4;

    a++;
    printf("a = %d\n",a);    /* Will output "a = 2" */
    b--;
    printf("b = %d\n",b);    /* Will output "b = 3" */

    if (++c > 1) { /* c is incremented by 1 before being compared in the condition */
        printf("This will print\n");    /* This is printed */
    } else {
        printf("This will never print\n");    /* This is not printed */
    }

    if (d-- < 4) {  /* d is decremented after being compared */
        printf("This will never print\n");    /* This is not printed */
    } else {
        printf("This will print\n");    /* This is printed */
    }
}

正如 cd 的示例所示,两个运算符都有两种形式,如前缀表示法和后缀表示法。两者在递增(++)或递减(--)变量时具有相同的效果,但它们返回的值不同:前缀操作首先执行操作然后返回值,而后缀操作首先确定要返回的值,然后做操作。

由于这种潜在的反直觉行为,在表达式中使用递增/递减运算符是有争议的。