【发布时间】:2023-03-08 11:19:01
【问题描述】:
我认为以下 sn-p 的行为应该是未定义的,但我只是想确保我理解正确。 假设我们有这段代码:
#include <iostream>
int main()
{
std::cout << "mamut" - 8 << std::endl;
return 0;
}
所以我认为它的作用是 (char*)((int)(const char*) - (int)),尽管之后的输出很奇怪,但我并不希望它有任何实际意义。所以我的问题是关于 char* 和 int 之间的转换 - 它是未定义的,还是背后有一些逻辑?
编辑: 让我补充一下:
#include <iostream>
int main ()
{
const char* a = "mamut";
int b = int(a);
std::cout << b << std::endl;
std::cout << &a <<std::endl;
// seems b!= &a
for( int i = 0; i<100;i++)
{
std::cout<<(const char*)((int)a - i)<<std::endl;
}
return 0;
}
我变得足够大后的输出给了我一个类似 _Jv_RegisterClasses 等的东西。 仅作记录:
std::cout << a - i << std::endl;
产生与以下相同的结果:
std::cout<<(const char*)((int)a - i)<<std::endl;
【问题讨论】:
-
这是未定义的行为,但不是因为您认为的原因。谷歌指针算法。
-
当您减去
8时,您似乎假设const char*被转换为int。假设是错误的。 -
为什么假设是错误的?我的意思是你不能添加 char*,因为 + 没有为 char* + char* 定义。
-
您的编辑也与原始问题无关。请在每个帖子中只问一个问题,如果您有不同的问题,请发布新帖子。
-
编辑几乎是同一个程序,但随着 i 变大(基本上你会看到除 "mamut" - 8 之外的其他结果)。我为每个 i 制定了循环原因,它打印出我正在谈论的输出。