类似的语法,但一个显示错误,但另一个不显示

时间:2010-08-14 16:31:44

标签: c operator-precedence

Hiii all

我今天制作了这个节目

int main()
{
   int a = 1,2; /* Shows error */
   int b = (1,2); /* No error */
}

为什么第一个显示错误而第二个没有? Just()使一个程序编译。为什么呢?

- 思鲁提

5 个答案:

答案 0 :(得分:9)

int a = 1,2; 2被视为变量名,不能以数字开头,因此错误。

int b = (1,2); comma operator从左到右评估操作数并返回列表中的最后一个表达式,即2

答案 1 :(得分:6)

在括号内,语言指定将出现表达式。在这种情况下(b),逗号表示来自C的逗号运算符。

如果没有括号,该语言指定变量声明以逗号分隔。在a的示例中,编译器(解析器)期待其他变量声明。

答案 2 :(得分:3)

原因是在您的第一个语句int a = 1,2;中,逗号未被解析为序列运算符。它是声明列表的一部分,并尝试实例化一个名为2的整数变量,该变量是该语言所不允许的。

第二个语句int b = (1,2);中的括号强制将逗号解析为序列运算符。

答案 3 :(得分:0)

(1,2)评估列表中的最后一个表达式,即2

另一个例子:(a,b,c)将评估为c

如果您想使用小数,请使用float / double类型并使用点作为小数符号:double d = 1.2;

答案 4 :(得分:0)

他们一个拳头都没有意义。

但后来我记得for循环中的多个操作。例如:

for (a=1,b=2; a<1; a++)

知道 1 是一个有效的表达式,并且这些表达式是有效的语言元素,我的结论是(1,2)评估1(但对它没有任何作用) ),然后评估2并返回2.

最后:

b = (1,2);

与以前一样评估1和2,返回2,并将其分配给b。