4

今天我们上了编程课。在控制台中非常容易练习。我编写了一个循环,通过 getchar() 从控制台逐字符加载,并进行赋值,所有这些都在循环术语中。

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

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

我试过这个

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

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

编辑:\我也读过这个为什么你会在条件中使用赋值?但这根本不是我的问题的答案。

4

2 回答 2

3

人们可能会争论此类代码的可读性(而且在我工作过的大多数地方,它都无法通过代码审查),但问题不在于存在分配这一事实。问题是getchar() 它不返回 a char,而是返回 a int。并且可能的返回值集不适合char. 如果您将代码更改为:

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

这将是“安全的”(但我仍然不想维护它)。如果您确实想要更新c循环控制,请使用for循环:

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

这至少是可读的。

于 2012-10-24T12:45:01.850 回答
2

您的示例中的主要操作!=不是分配。在 C# 中你不能做的事情(我认为这是正确的设计决定)是这样的:

if (s = "")
...

这里的问题是它与通常的 equals operator 非常相似==。在某些情况下,这段代码是故意的,但通常是一个很难找到的错字。将其与此进行比较:

if (s == "")
...

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

于 2012-10-24T12:44:33.880 回答