我在编写语句时错误地忘记了包含函数的名称。只有在调试中我才发现这一切,因为所有编译都很好。我很惊讶gcc没有对这样的C程序发出警告。
int x =0, a=1, b=2, c=3, d=4, e=5, f=6, g=7;
printf("\n%d %d %d %d %d %d %d %d\n",x,a,b,c,d,e,f,g);
x = (a,g=b+c,d,e,f);
printf("\n%d %d %d %d %d %d %d %d\n",x,a,b,c,d,e,f,g);
x = a,g=b+c,d,e,f;
printf("\n%d %d %d %d %d %d %d %d\n",x,a,b,c,d,e,f,g);
代码应该读取functionName(a,g = b + c,d,e,f),但缺少函数名称。
语法x =(a,g = b + c,d,e,f)导致x = f 语法x = a,g = b + c,d,e,f导致x = a
在两种情况下,g均正确计算为b + c。
第一个版本x =(...)的警告是否按顺序排列?以这种方式出现(...)有效的独立表达方式。副产物是包含或排除parens也导致x的两个不同值。由于parens而设置x = f看起来像是生成机器代码的方式而不是语法驱动。
似乎应该标记一个警告,可能这个分组表达式实际上是缺少函数调用的参数。更好地捕获这样的警告,而不是在调试期间发现问题。