2012-10-24 67 views
4

今天我们有一门程序课。控制台中的操作非常简单。我写了一个循环来加载控制台char char by char和getchar()的赋值,所有这些都是循环术语。在条件中使用赋值是否安全? C/C++,C#

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

有人说,这不是安全使用,其他人说,在C/C++我能做到这一点,但不是在C#。

我想这

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

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

编辑:\我也读这个Why would you use an assignment in a condition?但这不是我的问题的答案。

+0

在第二种情况下,它应该是“\ n”还是“”是正确的? – Omkant

+0

这些不是等同的陈述。 – asawyer

+0

为什么你怀疑这可能是不安全的? – besworland

回答

2

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

if (s = "") 
... 

这里的问题是,它是非常相似,通常等于操作==。有些情况下这种代码是故意的,但通常它是一个很难找到的错字。与此比较:

if (s == "") 
... 

当您在代码中查找错误时,您可以轻松忽略此问题。

+0

他问的是安全性,而不是可读性。他的代码中不安全的方面(在这种情况下,“不安全”意味着它对某些输入无法正确工作,事实上导致无限循环)是他将一个int赋给一个char ','int'可以使用的某些值不适合'char'。 –

+0

幸运的是,现代C++编译器在包含'if(s =“”)'并提示'if((s =“”))'时会发出警告。 – arnoo

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()) { 
... 

这至少是可读的。

+0

'不会在我工作的大多数地方通过代码审查'在条件中赋值,或者'getchar()'返回被存储到char中的事实?如果是前者,我会感到惊讶,似乎是一个相当普遍的做法。 – Mike

+0

@Mike两者,但我在想的是在一个有条件的任务。执行多于一件事情的单个语句通常会使代码难以阅读。 (另一方面,很多地方会在IO的单例情况下对副作用产生例外情况,像'while(std :: getline(...))'这样的东西是普遍而惯用的,尽管隐藏了任务。) –

+0

对于'循环'版本在C中是非法的。我更喜欢'while'循环版本。 –

相关问题