C

C 知识量:16 - 74 - 317

5.2 其他运算符><

sizeof运算符和size_t类型- 5.2.1 -

sizeof运算符用于以字节为单位返回运算对象的大小,运算对象可以是具体的数据对象或类型。如果运算对象是类型(例如:int),则必须使用圆括号括起来,如果是数据对象(例如:变量)则可以省略圆括号。

C语言规定,sizeof返回size_t类型的值。这是一个无符号整数类型,但不是新类型。C99标准新增了%zd转换说明用于printf()函数显示size_t类型的值,如果系统不支持%zd,可以使用%u或%lu代替%zd。示例:

#include <stdio.h>

int main(void) {
    int x = 56;
    printf("x is %u bytes.\n", sizeof x);
    printf("Type int is %u bytes.\n", sizeof (int));
    system("pause");
    return 0;
}

运行结果为:

x is 4 bytes.
Type int is 4 bytes.

求模运算符- 5.2.2 -

“%”称为求模运算符,用于整数运算,求模运算符给出其左侧整数除以右侧整数的余数。例如:

#include <stdio.h>

int main(void) {
    int x = 8;
    int y = 3;
    printf("%d", x % y);
    system("pause");
    return 0;
}

运算结果为:

2

对于负数求模,C99标准规定“趋零截断”,即如果第1个运算对象是负数,那么求模结果便是负数;如果第1个运算对象是正数,那么求模结果就是正数。如果当前系统不支持C99标准,就会显示不同结果。实际上,无论如何,可以使用a-(a/b)*b来计算a%b,以得到一致的结果。

递增运算符- 5.2.3 -

递增运算符写作“++”,用于将运算对象递增1。有两种使用方式,第1种方式是++位于变量前面,即前缀模式;第2种方式是++位于变量后面,即后缀模式。两种模式的相同点是都可以实现递增1,区别在于递增行为的发生时间不同。示例:

#include <stdio.h>

int main(void) {
    int x, y;
    x = y = 5;
    x = x++;
    y = ++y;
    printf("x=%d\n", x);
    printf("y=%d\n", y);
    system("pause");
    return 0;
}

运行结果为:

x=5
y=6

从以上结果可以看出,与赋值语句一同使用时,前缀模式先递增再赋值;后缀模式先赋值再递增。当然,如果单独使用递增运算符时,两种模式都是一样的。

递减运算符- 5.2.4 -

与递增运算符对应的,还有一个递减运算符,写作“--”,也有前缀模式和后缀模式之分,特性与递增运算符是一样的,只是功能用于将运算对象递减1。

优先级- 5.2.5 -

递增运算符和递减运算符都有很高的结合优先级,只有圆括号的优先级比它们高。因此,x*y++表示的是(x)*(y++),而不是(x*y)++。当然,(x*y)++是无效的,因为,递增和递减运算符只能用于一个变量(可修改的左值),而组合x*y本身不是可修改的左值。示例:

#include <stdio.h>

int main(void) {
    int x = 3;
    int y1 = 4;
    int y2 = 4;
    int z = (x + (y1++))*3;
    int w = (x + (++y2))*3;
    printf("z=%d\n", z);
    printf("w=%d\n", w);
    system("pause");
    return 0;
}

运行结果为:

z=21
w=24

以上结果表明,对于n++来说,是先使用,再递增;对于++n来说,是先递增,再使用。

对于递增和递减运算符使用时应当注意:

  • 如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符。

  • 如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符。