鉴于int foo[] = {0, 1, 2, 3};我想知道指向过去"一个过去"的迭代器是否无效.例如:auto bar = cend(foo) + 1;
有大量的抱怨和警告,这是Stack Overflow问题中的"未定义行为",如下所示:c ++当过去结束迭代器时,迭代器+整数的结果是什么?不幸的是,唯一的来源是挥手.
我购买它的麻烦越来越多,例如:
int* bar;
Run Code Online (Sandbox Code Playgroud)
是未初始化的,但肯定不会调用未定义的行为,并且给定了足够的尝试,我确信我可以找到一个实例,其中未初始化的值bar具有相同的值cend(foo) + 1.
这里最大的困惑之一是我不会要求解除引用cend(foo) + 1.我知道这将是未定义的行为,标准禁止它.但是这样的答案:https://stackoverflow.com/a/33675281/2642059只引用解除引用这样的迭代器是非法的,不回答这个问题.
我也知道C++只保证它cend(foo)是有效的,但它可能会numeric_limits<int*>::max()在这种情况下cend(foo) + 1溢出.我对这种情况不感兴趣,除非它在标准中被调出,因为我们不能让迭代器超过"一个接一个结束".我知道这int*只是一个整数值,因此会受到溢出的影响.
我想从一个可靠的来源引用一个引用,即将迭代器移到"一个接一个"的元素之外是未定义的行为.
在Python中,以下语句不起作用:
f = open("ftmp", "rw")
print >> f, "python"
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 9] Bad file descriptor
Run Code Online (Sandbox Code Playgroud)
但是使用以下代码它可以工作:
g = open("ftmp", "r+")
print >> g, "python"
Run Code Online (Sandbox Code Playgroud)
看起来我需要修改文件模式.文件打开模式的深层复杂性是什么?
我有一个代码块:
int main ()
{
char *p1 = "Hello";
char *p2;
p2 = (char*)malloc (20);
memset (p2, 0, 20);
while (*p2++ = *p1++);
printf ("%s\n", p2);
}
Run Code Online (Sandbox Code Playgroud)
但我无法解释线的工作(*p2 ++ =*p1 ++); 你能让我知道这个公式中的操作顺序吗?
我的大学教授最近给了我们一个实现我们自己的智能指针类的任务.在他用于复制字符串的样板代码中,我发现这件作品很漂亮的语法糖:
while (*sea++ = *river++);// C Sting copy
Run Code Online (Sandbox Code Playgroud)
我进一步研究了这段代码,发现它是strcpy.c中的确切代码,并在下面的stackoverflow问题中进一步解释它是如何工作的: "while(*s ++ =*t ++)"如何复制一个字符串?
当我尝试在我的下面的代码中使用这个语法糖时,它给出了垃圾作为结果并删除了存储在"river"中的字符串:
#include<iostream>
#include<cstring>
using namespace std;
void main()
{
const char *river = "water";// a 5 character string + NULL terminator
char *sea = new char[6];
while (*sea++ = *river++);
cout << "Sea contains: " << sea << endl;
cout << "River contains: " << river << endl;
}
Run Code Online (Sandbox Code Playgroud)
结果:

我知道我可以使用以下代码简单地实现所需的结果:
int i = 0;
while (i<6)
{
sea[i] = river[i];
i++;
}
Run Code Online (Sandbox Code Playgroud)
但这不是我想要的答案.我想知道我的while循环的实现或我的char指针的实例化有什么问题吗?
我想连接两个定义如下的字符串:
char hello[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char world[] = { ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0' };
Run Code Online (Sandbox Code Playgroud)
我明白我应该跑过第一个,找到'\0'标志而不是它开始第二个字符串.功能是否strcat以相同的方式工作?
我正在使用的代码:
for (int i = 0; i < 6; i++) {
if (hello[i] == '\0') {
for (int j = 0; j < 9; j++) {
int index = 5 + j;
hello[index] = world[j];
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译后我得到这样一个错误:
*堆栈粉碎检测到*:./ run终止
我究竟做错了什么?
在K&R C编程书中,我遇到了这个用于字符串复制的代码片段:
/* strcpy: copy t to s; pointer version 3 */
void strcpy(char *s, char *t)
{
while (*s++ = *t++)
;
}
Run Code Online (Sandbox Code Playgroud)
这正确地复制了两个字符数组(当然它确实如此).我的问题是,为什么它的工作方式呢?里面似乎没有任何条件检查.有一个作业和一个后期增量.我的直觉是这总是评估为真(类似于while(1)总是评估为true,我们需要在某个地方休息以摆脱循环.
循环内部也没有任何东西.没有绑定检查,没有ifs,没有.这对我来说似乎非常危险和鲁莽.有人可以带我走过这个吗?谢谢.