C++ c+;中分号前只有一个整数的代码行+;

C++ c+;中分号前只有一个整数的代码行+;,c++,C++,例如: 1; char const* a = "123"; for (int i = 0; i < 3; ++i) { std::cout << a[i]; } std::cout << "\n"; 它是做什么的?在内存中的任何地方都保存了整数吗?< /P> < P>这条代码在C++标准的抽象机中没有可观察到的效果。 编译器可以自由地将其存储在内存中,也可以不存储。如果存储,则不能通过C++标准下定义的任何行为访问。大多数启用了合理优化设置的编译器都会将其视

例如:

1;
char const* a = "123";
for (int i = 0; i < 3; ++i) {
  std::cout << a[i];
}
std::cout << "\n";

它是做什么的?在内存中的任何地方都保存了整数吗?< /P> < P>这条代码在C++标准的抽象机中没有可观察到的效果。 编译器可以自由地将其存储在内存中,也可以不存储。如果存储,则不能通过C++标准下定义的任何行为访问。大多数启用了合理优化设置的编译器都会将其视为noop,如果您的警告级别合理,质量良好的编译器应该发出警告


一般来说,C++代码的行为在标准中描述为抽象机器的行为。这在语言中很常见。但是与其他抽象机器语言不同,C++在抽象机器上留下许多未定义的操作。 符合标准的编译器可以自由生成与抽象机器行为相同的任何机器代码(或任何东西),只要该机器的行为是由标准定义的

<>这意味着没有可观察到的效果可以完全被C++编译器完全消除。这包括语句
3

即使是具有可观察效果的事物也可以消除,只要可观察效果仍然存在。例如:

1;
char const* a = "123";
for (int i = 0; i < 3; ++i) {
  std::cout << a[i];
}
std::cout << "\n";
char const*a=“123”;
对于(int i=0;i<3;++i){

std::cout此语句没有明显的效果。它对表达式求值,求值为1,然后丢弃结果。将其读为“noop”而不是“no op”,然后有点咯咯笑。+1为什么const char*a=“123”有意义?123在哪里保存?@dangha:在你的可执行文件中。也就是说,如果
a
未被使用,它可能不会被保存(当没有可观察的效果时进行优化)这是一个不同的问题。这不是一个只包含一个数字,后面是分号的语句。这个语句,取决于下面的内容,在抽象的机器中可能有可观察的效果;它也不可能有这样的效果。C++没有定义代码和汇编程序之间的映射,它描述了抽象的行为。C++和C++编译器都可以创建抽象代码的机器代码。C++允许某些操作是不定义的,允许编译器进行大规模优化。但是,还有一件事我不理解。指针怎么能有“123”作为它的值?