我是一名最近对计算机科学感兴趣的学生。我正在研究C ++,因为我对嵌入式系统感兴趣。
当我尝试独自测试操作员/=
时。我想边做边学。我写的代码是
int a / = --b + 3;
但是编译器给了我一条错误消息。但是当我将其修改为
int a = 0;
a /= --b + 3;`
效果很好。我认为这与L值和R值有关。为什么带有运算符/=
的第一个示例给我一个错误,但是上面的第二个示例没问题?我可以请您参考一下以获得有关此问题的提示吗?
PS:当我测试时
int t = t / (--a + 3);
它也运作良好!有什么区别?你能指出我一些有关此的文件吗?
答案 0 :(得分:4)
我想说两件事。
让我们看看两者。
当我测试“ int a / =-b + 3”时,它有错误,但是当我修改为“ int a = 0;
a / =-b + 3;“,效果很好。
与Java不同,C / C ++不会自动将整数的值初始化为0,并且包含garbage value(正式称为“不确定值”)。因此int a/=--b+3;
更像int a; a/=--b+3;
,它仍然是毫无意义的值。
并且在声明变量时,C / C ++语法不允许/=
。这是变量声明和初始化的方法。我不确定还有更多方法。
int a = 1;
int a(1);
int a{1};
(自C ++ 11起)答案 1 :(得分:3)
a /= b;
与以下相同:
a = a / b;
所以这意味着以下声明毫无意义:
int a /= (--b + 3);
因为它等同于:
int a = a / (--b + 3);
假设这里已经定义了b
;问题是a
尚未定义,因此不能用作分配的一部分。
这里的问题与以下语句的问题相同:
int a = a;
这也解释了以下代码起作用的原因:
int a = 0;
a /= (--b + 3);
因为它等效于此:
int a = 0;
a = a / (--b + 3);
由于a
在上面的第二行中已知,因此可以定义RHS,并确定a
的新值。
更一般而言,在变量初始化期间,不应使用诸如/=
,*=
,+=
,-=
和%=
之类的运算符。如果您尝试执行此操作,则编译器(例如g ++)应返回错误。