左侧后增量

kum*_*mar 7 c pointers

我的印象是,后增量(OR preincrement)只能在相等(=)的右侧进行.但我能够编译下面的代码.你能帮助我理解这个特定的代码,特别是在线下.来源:http://www.ibm.com/developerworks/library/pa-dalign/

*data8++ = -*data8;


void Munge8( void *data, uint32_t size ) {
    uint8_t *data8 = (uint8_t*) data;
    uint8_t *data8End = data8 + size;

    while( data8 != data8End ) {
        *data8++ = -*data8;
    }
}
Run Code Online (Sandbox Code Playgroud)

Bil*_*nch 7

所以,我很确定这是未定义的行为.除最终分号外没有序列点:

    *data8++ = -*data8;
Run Code Online (Sandbox Code Playgroud)

如果data8等于0x20,则它等于:

    *(0x20) = -*(0x20);
Run Code Online (Sandbox Code Playgroud)

要么

    *(0x20) = -*(0x24);
Run Code Online (Sandbox Code Playgroud)

因为没有办法做出这个决定,(因为你在读取变量时编辑了一个变量,没有交错序列点),这是未定义的行为.


我们可以谈谈下面这段代码的作用.这可能是上述代码的意图.

while( data8 != data8End ) {
    *data8 = -*data8;
    data8++;
}
Run Code Online (Sandbox Code Playgroud)

你在这里所做的事情希望更加直截了当.您正在接收输入数组,并查看它,因此它是一系列8位数字.然后,就地,你否定每一个.

  • @JohnBode:正确.`data8`正在递增.但是,我们在这个表达式中读了两次`data8`.一旦进入LHS,一旦进入RHS.RHS的读取是在指针递增之前还是之后发生的?我认为它是未知的. (2认同)

Car*_*rum 4

我猜你的印象是错误的。你绝对可以做这样的事情:

*a++ = *b++;
Run Code Online (Sandbox Code Playgroud)

事实上,这通常就是strcpy实施的方式。您甚至可以在没有任何情况下进行后增量或前增量=

a++;
Run Code Online (Sandbox Code Playgroud)

  • @VladLazarenko:为什么必须在 LHS 之前评估 RHS?我认为没有理由不能对两者进行交错或以相反的顺序进行评估。 (2认同)