为什么这个声明会编译?

时间:2013-08-02 18:07:48

标签: c

为什么以下代码行不会产生错误?

double x = 4.2, y;

此外,x似乎被分配到4.2,而不是y的值(似乎是1e-39,或非常接近0)。

7 个答案:

答案 0 :(得分:14)

它与:

相同
double x = 4.2;
double y;

" y"变量包含一些垃圾值(因为它的值未指定),直到你给它一个值。它的行为方式是因为逗号运算符的优先级低于C / C ++中的赋值。

答案 1 :(得分:8)

这是两个double个对象的声明,一个名为x,初始化为4.2,另一个名为y,未初始化。

更明确地写为:

double x = 4.2;
double y;

如果它出现在文件范围内,y会隐式初始化为0.0;否则它的价值就是垃圾。

如果您想要分配,则必须删除double关键字,例如:

x = 4.2;

如果你写了:

 x = 4.2, y;

然后,将是一个逗号运算符,由于逗号的优先级低于=,因此它等同于:

(x = 4.2), y;

或:

x = 4.2;
y;

在这种情况下,对y的引用毫无用处。

答案 2 :(得分:3)

这是一个声明,其初始值分配给x,而y没有初始值(y的值将不指定,取决于编译器。)

这些都是合法的语法:

double x, y;
double x = 4.2;
double x = 4.2, y;

我个人更喜欢将我的声明分开,例如:

double x = 4.2;
double y;

我发现它更容易理解,如果其中一种类型发生变化或需要额外评论,则更容易修改。

答案 3 :(得分:3)

,不是逗号运算符。它是分隔声明x(分配给4.2)和y。

的分隔符

答案 4 :(得分:1)

您要声明2个double类型的变量,但您只是将值分配给xy仍未初始化,可能包含任何值。声明具有由,;

分隔的名称的相同类型的多个变量是有效的语法

答案 5 :(得分:1)

声明分配允许您在一行中声明多个变量:

string s1;
string s2;
string s3 = "test";

与:

相同
string s1, s2, s3 = "test"

答案 6 :(得分:1)

double x = 4.2, y;

声明{double}类型的x变量并使用值4.2初始​​化它,并声明另一个名为y的变量。注意:为什么目前没有值。 您的陈述也可以写成

double y, x = 4.2;