在条件下使用作业是否安全? C / C ++,C#

时间:2012-10-24 12:36:44

标签: c# c++ c

我们今天有一个编程课。在控制台中非常容易锻炼。我写了一个循环来从控制台char加载char by getchar()并赋值,所有这些都是循环术语。

char c;
while((c = getchar()) != '\n'){
...

有人说,这是不安全的,其他人说,在C / C ++中,我可以这样做,但不能在C#中。

我试过这个

string s;
if((s = Console.ReadLine()) != ""){
...

但这也有效,所以我不明白为什么这是不安全的。或者不是吗?

编辑:\ 我还阅读了此Why would you use an assignment in a condition?,但这根本不是我的问题的答案。

2 个答案:

答案 0 :(得分:3)

人们可以争论这些代码的可读性(并且它不会通过 我工作的大多数地方的代码审查,但问题不是事实 有一项任务。问题在于getchar() 如果不返回char,则返回int。那一套 可能的返回值不适合char。如果您更改了代码 到:

int c;
while ( (c = getchar()) != EOF && c != '\n' ) {
...

它会“安全”(但我仍然不想维护它)。如果你 我希望在循环控件中更新c,使用for循环:

for ( int c = getchar(); c != EOF && c != '\n'; c = getchar() ) {
...

这至少是可读的。

答案 1 :(得分:2)

示例中的主要操作是!=,这不是一项任务。 你不能用C#做什么(我认为这是正确的设计决定)是这样的:

if (s = "")
...

这里的问题是它与通常的equals运算符==非常相似。有些情况下这个代码是有意的,但通常是一个很难找到的拼写错误。与此相比:

if (s == "")
...

当您在代码中查找错误时,您很容易忽略这一点。