Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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++_Loops_Pointers_Increment - Fatal编程技术网

C++ 正确递增指针?

C++ 正确递增指针?,c++,loops,pointers,increment,C++,Loops,Pointers,Increment,我用一个char*数组将字符串的一部分复制到另一个char*数组中,我想知道是否这样做 do { *pntr1++ = *pntr2++ } while (*pntr2 != '\0'); 是同一件事吗 do { *indPtr = *wordPtr; indPtr++; wordPtr++; } while (*wordPtr != '\0'); 或者我最终会跳过使用第一个方法的索引吗?当像a++一样使用时,操作符++首先返回a的值,然后递增它 那么,代码呢

我用一个char*数组将字符串的一部分复制到另一个char*数组中,我想知道是否这样做

do {
    *pntr1++ = *pntr2++
} while (*pntr2 != '\0');
是同一件事吗

do
{
    *indPtr = *wordPtr;
    indPtr++;
    wordPtr++;
} while (*wordPtr != '\0');

或者我最终会跳过使用第一个方法的索引吗?

当像
a++
一样使用时,操作符
++
首先返回
a
的值,然后递增它

那么,代码呢

*a++ = *b++


a++
类似使用时,运算符
++
首先返回
a
的值,然后将其递增

那么,代码呢

*a++ = *b++


是等效的。

是的,两者是等效的。后增量是指在表达式中使用增量之前的值,增量发生在表达式结束之前(或C++术语)之前的序列点之前,“下一个表达式”排序。 因此,在这两种情况下,赋值在指针递增之前使用指针的值,而与
\0
的比较在指针递增之后使用指针的值


如果您希望复制一个字符串,这确实会导致一个问题:至少在您显示的代码中,终止(假定)字符串的
\0
不会被复制(尽管您可以在之后添加代码来终止目标字符串)。

是的,两者是等效的。后增量是指在表达式中使用增量之前的值,增量发生在表达式结束之前(或C++术语)之前的序列点之前,“下一个表达式”排序。 因此,在这两种情况下,赋值在指针递增之前使用指针的值,而与
\0
的比较在指针递增之后使用指针的值


如果您希望复制字符串,这确实会导致一个问题:至少在您显示的代码中,终止(假定)字符串的
\0
不会被复制(尽管您可以在之后添加代码以终止目标字符串)。

您尝试过吗?发生了什么?@RogerRowland在可能存在未定义行为的情况下,依赖某个特定实例中的“发生了什么”可能是个坏主意。是的,两者都是相同的:我更喜欢
while(*pntr1++=*pntr2++)@DavidBrown你对我的问题读得太多了。一个简单的测试将显示任何固有的差异,除了在这两种情况下都没有对输入进行空检查外,还没有涉及真正的“未定义行为”。您尝试过吗?发生了什么?@RogerRowland在可能存在未定义行为的情况下,依赖某个特定实例中的“发生了什么”可能是个坏主意。是的,两者都是相同的:我更喜欢
while(*pntr1++=*pntr2++)@DavidBrown你对我的问题读得太多了。一个简单的测试将显示任何固有的差异,除了在这两种情况下都没有对输入进行null检查外,还没有涉及真正的“未定义行为”。是的,我刚刚遇到了这个问题,循环一直运行,直到数组中没有内存地址,因为递增语句跳过了“\0”。有什么方法可以避免这仍然会复制数组?@Bbvarghe:您通常需要类似
的东西,而((*d++=*s++)!='\0'){}
所以您复制一个字节并立即检查该字节的值,如果它是你的终止符,就打破循环。语句
*d++=*s++
如何与
'\0'
相比较?@Bbvarghe:赋值是一个产生结果(赋值)的表达式。是的,我刚刚遇到了这个问题,由于递增语句跳过“\0”,循环将一直运行,直到数组中没有内存地址为止。有什么方法可以避免这仍然会复制数组?@Bbvarghe:您通常需要类似
的东西,而((*d++=*s++)!='\0'){}
所以您复制一个字节并立即检查该字节的值,如果它是您的终止符,则中断循环。如何将语句
*d++=*s++
'\0'
进行比较?@Bbvarghe:赋值是产生结果(赋值)的表达式。