为什么在逗号运算符(例如下面的示例)中指定的表达式不被视为常量表达式?
例如,
int a = (10,20) ;
Run Code Online (Sandbox Code Playgroud)
当在全局范围内给出时产生错误"初始化器不是常量",尽管由逗号运算符分隔的两个表达式都是常量(常量表达式).为什么整个表达式不被视为常量表达式?为了澄清我已经阅读了','运算符在C中做了什么?和C逗号运算符的使用.他们没有涉及逗号运算符的这个方面.
请检查以下程序.
#include <stdio.h>
struct st
{
int a ;
}
fn ()
{
struct st obj ;
obj.a = 10 ;
return obj ;
}
int main()
{
struct st obj = fn() ;
printf ("%d", obj.a) ;
}
Run Code Online (Sandbox Code Playgroud)
以下是问题
哪里 ';' 终止'struct st'的声明?
根据ISO IEC 9899-1999规范,声明应以';'结尾.
declaration-specifiers init-declarator-listopt ;
Run Code Online (Sandbox Code Playgroud)如果'struct st'的声明仅代表函数'fn'的返回类型,那么它对其他函数(main)的可见性如何?
我正在与GCC进行自动矢量化.由于客户要求,我无法使用内在函数或属性.(我无法获得用户输入以支持矢量化)
如果可以矢量化的数组的对齐信息未知,则GCC调用"循环版本控制"的传递.在树上进行循环矢量化时,将执行循环版本控制.当一个循环被识别为可矢量化,并且对数据对齐或数据依赖性的约束阻碍它(因为它们不能在编译时确定),那么将生成两个版本的循环.这些是循环的矢量化和非矢量化版本,以及对齐或依赖性的运行时检查,以控制执行哪个版本.
我的问题是我们如何加强协调?如果我找到了一个可矢量化的循环,我不应该因为缺少对齐信息而生成两个版本的循环.
例如.请考虑以下代码
short a[15]; short b[15]; short c[15];
int i;
void foo()
{
for (i=0; i<15; i++)
{
a[i] = b[i] ;
}
}
Run Code Online (Sandbox Code Playgroud)
<SNIP>
vector short int * vect_pa.49;
vector short int * vect_pb.42;
vector short int * vect_pa.35;
vector short int * vect_pb.30;
bb 2>:
vect_pb.30 = (vector short int *) &b;
vect_pa.35 = (vector short int *) &a;
if (((signed char) vect_pa.35 | (signed char) vect_pb.30) & 3 == 0) ;; <== (A) …Run Code Online (Sandbox Code Playgroud) 请检查以下代码段
struct st
{
struct st
{
int a ;
int b ;
} st;
int a1 ;
} ;
struct st obj ;
struct st obj1 ;
int main()
{
return obj.a1 + obj1.b ;
}
Run Code Online (Sandbox Code Playgroud)
Microsoft的编译器Visual Studio 6.0成功编译该程序.我对'struct st'的使用感到困惑.obj和obj1的大小是多少?