gpt4 book ai didi

c++ - C++11 标准的哪些规则用于确定 ({ ... }) 中表达式的类型

转载 作者:行者123 更新时间:2023-11-27 23:44:33 26 4
gpt4 key购买 nike

我不明白编译器在这里做了什么以及为什么它能运行 C++ 代码

#include <cstdio>
int main()
{
printf( ({ // (1)
struct some_noize_struct {
// there may be another code
};
42;
"abc";
}) // (2)
);

return 0;
}

(1)和(2)大括号之间的表达式类型是const char*。经过一些实验,我理解了上一部分确定的那种类型的 (1)-(2)-expression。

这是一个示例代码。它适用于 c++11 及更高版本。 http://cpp.sh/5tb47

我的问题:它是如何工作的。

最佳答案

正如@HolyBlackCat 所解释的,您列出的代码使用 GCC 编译器对 C++(和 C)的扩展,同时允许将复合语句用作表达式。

在您的 printf() 语句中,您需要提供一个 const char*const char* & 表达式作为第一个参数功能,例如printf("hello")printf(getenv("PATH"))。该扩展允许使用 block 中的最后一条语句将花括号 block 解释为这样的表达式。你的情况是:

{ 
struct some_noize_struct { 42 };
42;
"abc";
}

其中有 3 个语句。最后一条语句是整个表达式的值,这意味着 printf() 看到的内容与您键入 printf("abc") 的内容基本相同。

这种代码is not standard C++ (C++11 or any another version), nor is it standard C .

我建议你写信给“C++ Shell”网站的维护者,要求他们显示他们使用的确切编译命令行,和/或确保他们使用--std=c++11 来编译 C++11 代码——看起来他们并没有这样做。

关于c++ - C++11 标准的哪些规则用于确定 ({ ... }) 中表达式的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51689320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com