zoukankan      html  css  js  c++  java
  • ISO/IEC 9899:2011 条款6.5.3——单目操作符

    6.5.3 单目操作符

    语法

    1、unary-expression:

            postfix-expression

            ++  unary-expression

            --  unary-expression

            unary-expression    cast-expression

            sizeof    unary-expression

            sizeof    ( type-name )

            _Alignof    ( type-name )

        unary-operator:    以下之一

            &    *    +    -    ~    !

    6.5.3.1 前缀递增与递减操作符

    约束

    1、前缀递增或递减操作符的操作数应该具有原子、限定、或非限定的实数或指针类型,并且应该是一个可修改的左值。

    语义

    2、前缀++操作符的操作数的值被递增。结果是在递增后操作数的新的值。表达式 ++E 等价于 (E += 1)。见加法操作符与复合赋值信息上的约束、类型、副作用以及转换和对指针操作影响的讨论。

    3、前缀--操作符类似于前缀++操作符,除了操作数的值是递减的。


    6.5.3.2 地址与间接操作符

    约束

    1、单目 & 操作符的操作数应该要么是一个函数指派符, [] 或单目 * 操作符的结果,要么是指派一个对象的左值,该对象不是一个位域,且不以register存储类说明符来声明。

    2、单目 * 操作符的操作数应该具有指针类型。

    语义

    3、单目 & 操作符产生了其操作数的地址。如果该操作数具有类型“type”,那么结果是类型“指向type的指针”。如果操作数是一个单目 * 操作符,那么 * 操作符与 & 操作符都不会被计算,并且结果就好比两个操作符都被忽略一样,除了对操作符的约束仍然应用,以及结果也不是一个左值。类似地,过操作数是一个 [] 操作符的结果,那么 & 操作符与被 [] 指示的单目 * 操作符都不被计算,并且结果就好比& 操作符被移除,且 [] 操作符被变为一个 + 操作符。否则,结果是指向该对象或由其操作数所指派的函数的一个指针。

    4、单目 * 操作符表示了间接操作。如果操作数指向一个函数,那么结果是一个函数指派符;如果它指向了一个对象,那么结果是一个指派该对象的一个左值。如果操作数具有“指向type的指针”,那么结果具有类型“type”。如果一个无效的表达式被赋给了该指针,那么单目 * 操作符的行为是未定义的。[注:从而,&*E 等价于E(即使E是一个空指针),以及 &(E1[E2]) 等价于 ((E1) + (E2))。如果E是一个函数指派符或是单目 & 操作符的一个有效操作数的一个左值,那么 *&E 是一个函数指派符或等价于E的一个左值。如果 *P 是一个左值,且T是一个对象指针类型的名称,那么 *(T)P 是一个具有兼容于T所指向对象的类型的一个左值。对于通过一个单目 * 操作符做解引用的无效值之中,可能是一个空指针、一个不恰当对齐的指向对象类型的地址,以及在其生命周期结束之后的一个对象的地址。]


    6.5.3.4 sizeof与_Alignof操作符

    约束

    1、sizeof操作符不应该应用于具有函数类型或一个不完整类型的一个表达式,也不能应用于用圆括号括起来的这么一个类型,以及不能应用于指派一个位域成员的一个表达式。_Alignof操作符不应该应用于一个函数类型或一个不完整类型。

    语义

    2、sizeof 操作符产生其操作数的大小(按字节计算),这可以是一个表达式或用圆括号括起来的一个类型名。该大小由其操作数的类型确定。结果是一个整数。如果操作数的类型是一个变长数组类型,那么该该操作数被计算;否则,操作数不被计算,并且结果是一个整数常量。

    3、_Alignof操作符产生其操作数类型的对齐要求。该操作数不被计算,并且结果是一个整数常量。当应用于一个数组类型时,该结果是该元素类型的对齐要求。

    4、当sizeof被应用于具有char、unsigned char、或signed char类型的一个操作数时,(或上述的一个限定版本)那么结果为1。当应用于一个具有数组类型的一个操作数时,那么结果是数组中字节总数的结果。[注:当应用于一个声明为具有数组或函数类型的一个形参时,sizeof操作符产生调整后的(指针)类型(见6.9.1)]当应用于一个具有结构体或联合体类型的一个操作数时,结果是这么一个对象中的字节总数,包括内部以及尾随的填充。

    5、两个操作符的结果值都是实现定义的,并且其类型(一个无符号整数类型)为size_t,定义在<stddef.h>中(以及其它头文件中)。

    6、例1 对sizeof操作符的一个基本使用是与诸如存储分配以及I/O系统进行通信的。一个存储分配的函数可能接受一个对象的大小(以字节计算)来分配并返回一个指向void的指针。比如:

    extern void *alloc(size_t);
    double *dp = alloc(sizeof *dp);

    alloc函数的实现应该确保其返回值适当地对于,用于指向double的指针转换。

    7、例2 sizeof操作符的另一种使用是计算一个数组中元素个数:

    sizeof array / sizeof array[0]

    8、例3 在本例子中,一个变长数组的大小被计算并从一个函数返回:

    #include <stddef.h>
    
    size_t fsize3(int n)
    {
        char b[n + 3];    // 变长数组
        return sizeof b;  // 执行时sizeof
    }
    
    int main(void)
    {
        size_t size;
        size = fsize3(10);    // fsize3返回13
        return 0;
    }
  • 相关阅读:
    27-Perl 进程管理
    26-Perl 包和模块
    25-Perl CGI编程
    YUM极速安装mariadb
    yum极速安装mysql5.7
    切换阿里yum镜像源
    mysql生成随机字符串函数
    Unable to locate value meta plugin of type (id)
    centos 挂载NTFS移动硬盘
    总有你要的编程书单(GitHub )
  • 原文地址:https://www.cnblogs.com/zenny-chen/p/4849671.html
Copyright © 2011-2022 走看看