C++ 正确递增指针?
我用一个char*数组将字符串的一部分复制到另一个char*数组中,我想知道是否这样做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的值,然后递增它 那么,代码呢
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:赋值是产生结果(赋值)的表达式。