C++ 是否允许三值运算符计算C+中的两个操作数+;?

C++ 是否允许三值运算符计算C+中的两个操作数+;?,c++,visual-studio,visual-c++,C++,Visual Studio,Visual C++,在将一些C代码移植到Windows时,我在MSVC++中发现了一个有趣的三元运算符行为。编译器似乎会对周围的两个分支进行求值:在以下示例中: #包括 结构{ int x; }; int getNum(){ printf(“get num\n”); 返回4; } int main(int argc,字符**argv){ 结构S=argc?(结构S){.x=getNum()}:(结构S){.x=getNum()}; printf(“%d\n”,s.x); 返回0; } 印刷品: get num g

在将一些C代码移植到Windows时,我在MSVC++中发现了一个有趣的三元运算符行为。编译器似乎会对
周围的两个分支进行求值:在以下示例中:

#包括
结构{
int x;
};
int getNum(){
printf(“get num\n”);
返回4;
}
int main(int argc,字符**argv){
结构S=argc?(结构S){.x=getNum()}:(结构S){.x=getNum()};
printf(“%d\n”,s.x);
返回0;
}
印刷品:

get num
get num
4
但是,GCC和Clang只计算一次
getNum()。标准允许或正确的行为是什么?

根据C++11:

条件表达式从右向左分组。第一个表达是 上下文转换为bool(第4条)。对其进行评估,如果 如果为true,则条件表达式的结果为 第二个表达式,否则为第三个表达式只有一个 计算第二个和第三个表达式的。每一个价值 与第一个表达式相关的计算和副作用是 在每次数值计算和相关副作用之前排序 使用第二个或第三个表达式

根据C11:

计算第一个操作数;在其之间有一个序列点 求值和第二个或第三个操作数的求值 (以评估值为准)仅当 第一个值不等于0;仅计算第三个操作数 如果第一个值等于0结果是 第二个或第三个操作数(以计算值为准),转换为 类型如下所述


只有问号后面的一个表达式可以合法计算。表面上,MSVC++是错误的,Clang和GCC是正确的。但是,由于复合文字不是标准C++(AFAIK)的一部分,所以不清楚代码应该编译为C++——如果它是这样做的,那么它使用一个实现定义的扩展,也许该扩展的不同定义提供了一些缓和环境,解释了为什么代码在MSVC++与GCC和Clang中的行为。这是Visual Studio 2019(16.3.9)。实际上,源代码文件的扩展名是*.c,这意味着c模式吗?
.c
扩展名通常意味着c代码。如果它被编译为C,那么很难计算出是什么赋予了编译器评估两个初始值设定项的许可——在通常的事件过程中,它不应该这样做。在MSVC文档中可能有一些文档,但不太可能。有意义的是,这个问题应该被编辑来提及C而不是C++。很抱歉造成混淆。@Ayxan OP的理解与标准中的内容一致。那么这是否意味着MSVC++做错了什么?@babon-几乎可以肯定,MSVC(或MSVC++)对三元运算符处理不当。