Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针的操作顺序_C_String - Fatal编程技术网

C 指针的操作顺序

C 指针的操作顺序,c,string,C,String,您能解释一下以下反转字符串的函数的操作顺序吗 //http://www.perlmonks.org/?node_id=589993 source of method /* reverse a string in place, return str */ static char* reverse(char* str) { char* left = str; char* right = left + strlen(str) - 1; char tmp; while

您能解释一下以下反转字符串的函数的操作顺序吗

//http://www.perlmonks.org/?node_id=589993 source of method
/* reverse a string in place, return str */
static char* reverse(char* str)
{
    char* left  = str;
    char* right = left + strlen(str) - 1;
    char  tmp;
    while (left < right)
    {
        tmp      = *left;
        *left++  = *right;//This part is real confusing...Does ++ happen after the assignment?
        *right-- = tmp;//This one is just as bad
    }
    return str;
}
//http://www.perlmonks.org/?node_id=589993 方法来源
/*将字符串反转到位,返回str*/
静态字符*反向(字符*str)
{
char*left=str;
char*right=left+strlen(str)-1;
char-tmp;
while(左<右)
{
tmp=*左;
*left++=*right;//这部分真的很混乱……赋值后会发生++?
*右--=tmp;//这个也一样糟糕
}
返回str;
}
我可以很容易地遵循方法中的前3行,但是一旦它进入while循环,我就不知道它是如何工作的。特别是上面标记的行。多谢各位

*left++  = *right
在该语句中,
*left
被赋值为
*right
,然后在所有这些赋值之后,
left
(不是
*left
)被递增。同样的逻辑适用于
*右侧--

重写后的伪代码是这样的:

while(not halfway)
{
    tmp = left value
    left value = right value
    left position += 1
    right value = tmp
    right position -= 1        
}
在该语句中,
*left
被赋值为
*right
,然后在所有这些赋值之后,
left
(不是
*left
)被递增。同样的逻辑适用于
*右侧--

重写后的伪代码是这样的:

while(not halfway)
{
    tmp = left value
    left value = right value
    left position += 1
    right value = tmp
    right position -= 1        
}

后减量运算符发生在取消引用之后,并且在赋值之后(在代码中)非常有效。

后减量运算符发生在取消引用之后,并且在赋值之后(在代码中)非常有效。

要理解代码,请在代码中添加括号:

*left++  = *right;
同:

*(left++) = *right;
*left = *right;
left++;
换句话说,++应用于指针,而不是指针指向的对象

由于这是增量后运算符,副作用在使用
left
的值后发生。换句话说,这与:

*(left++) = *right;
*left = *right;
left++;

为了理解代码,如果在代码中添加括号,则更容易理解:

*left++  = *right;
同:

*(left++) = *right;
*left = *right;
left++;
换句话说,++应用于指针,而不是指针指向的对象

由于这是增量后运算符,副作用在使用
left
的值后发生。换句话说,这与:

*(left++) = *right;
*left = *right;
left++;
你明白了

*left++  = *right;
  • 取消引用
    *右侧
  • *左侧存储(1)
  • 增量<代码>左侧
  • tmp
    存储在
    *右侧
  • 减量
    右侧
  • 后缀递增/递减(
    ++
    /
    --
    )运算符的优先级高于取消引用(
    *
    )。因此,
    *left++
    被解析为
    *(left++)
    。作为增量后操作,增量发生在该序列之后(即,分配发生之后)。

    您得到了它

    *left++  = *right;
    
  • 取消引用
    *右侧
  • *左侧存储(1)
  • 增量<代码>左侧
  • tmp
    存储在
    *右侧
  • 减量
    右侧
  • 后缀递增/递减(
    ++
    /
    --
    )运算符的优先级高于取消引用(
    *
    )。因此,
    *left++
    被解析为
    *(left++)
    。作为增量后操作,增量发生在该序列之后(即分配发生之后)。

    此行:

    *left++ = *right;
    
    有两个副作用:
    left
    递增以指向它所指向的数组的下一个元素,并且从地址
    right
    读取的值存储在递增之前指向的位置
    left
    。但是,指针变量
    left
    的存储是在指针变量指向的字符的存储之前还是之后进行的,没有定义顺序。

    此行:

    *left++ = *right;
    
    有两个副作用:
    left
    递增以指向它所指向的数组的下一个元素,并且从地址
    right
    读取的值存储在递增之前指向的位置
    left
    。但是,指针变量
    left
    的存储是在指针变量指向的字符的存储之前还是之后进行的,没有定义顺序。

    后缀运算符(包括
    ++
    --
    )的优先级高于一元运算符(例如
    *
    )。因此,表达式
    *p++
    被解析为
    *(p++)
    ,因此
    *
    应用于
    p++
    的结果

    所以

    相当于

    *left = *right;
    left++;
    
    后缀运算符(包括
    ++
    -->
    )的优先级高于一元运算符(如
    *
    )。因此,表达式
    *p++
    被解析为
    *(p++)
    ,因此
    *
    应用于
    p++
    的结果

    所以

    相当于

    *left = *right;
    left++;
    
    作业完成后会发生吗? 不。p的增量可能发生在赋值之前,但这在这里并不重要

    重要的一点是赋值只能看到
    p
    增加之前的值
    p
    p++
    返回的
    p
    多!x
    返回
    x

    p++
    返回
    p
    的原始值,其行与

    TYPE* post_inc(TYPE* p) {
       TYPE* tmp = p;
       ++p;
       return tmp;
    }
    
    总之,它看起来像:

        tmp = *left;
    
        anon0 = left;
        ++left;
        *anon0 = *right;
    
        anon1 = right;
        --right;
        *anon1 = tmp;
    
    (实际顺序可能会有所不同。)

    作业后是否会发生++? 不。p的增量可能发生在赋值之前,但这在这里并不重要

    重要的一点是赋值只能看到
    p
    增加之前的值
    p
    p++
    返回的
    p
    多!x
    返回
    x

    p++
    返回
    p
    的原始值,其行与

    TYPE* post_inc(TYPE* p) {
       TYPE* tmp = p;
       ++p;
       return tmp;
    }
    
    总的来说,它看起来有点像