如何在C++中合法地写入 :::,在C#中写入 ????

5
这些问题是一种游戏,我找不到它们的解决方案。
在C++中可以写:::而不使用引号或其他任何东西,编译器会接受它(宏也是被禁止的)。

同样的情况也适用于C#,但在C#中,你必须写???

我认为C++将使用::作用域运算符,而C#将使用? :,但我不知道它们的答案。

有什么想法吗?


13
什么是“what in the sam hill”的意思? - Tyler McHenry
6
我猜这是一道作业问题,被压缩成了一个词汇混合体。 - Karmic Coder
这些问题是在讲座开始时给我们的,说:“如果有人已经了解这个主题,他们可以在这个问题上工作” :) - nbitd
8
他要求一个可接受的 C++ 程序,其中包含 ::: 而不是字符串字面量。这实际上是一个有趣的问题,因为按最大匹配原则,一个独立的 ::: 将被解析为 :: :,所以三元运算符无法帮助解决问题。 我所能做的最好方法是滥用双字符:const int dim=10; int a<:::dim>; - user168715
3个回答

4

你可以在C#中写三个连续的问号,但不能没有空格,使用空值合并运算符和可空别名字符:

object x = 0;
int y = x as int? ?? 1;

1

有空格,很容易:

C++

class A{};
class B : :: A{};

或者

int foo;

int bar(){
    return decision ? -1 : :: foo;
}

但是如果没有空格,这些代码将无法编译(编译器会看到:: :,这没有任何意义)。

同样地,Aaronaught 在C#中给出了一个很好的? ??示例,但是如果没有空格,编译器会将其视为?? ?,这将无法编译。


你有没有一个参考,可以让C#编译器将???视为?? ??更有道理的是,编译器根本就看不到它。 - Fitzchak Yitzchaki
@Mendy:没有空格(???),编译器会出现两个错误:“无效的表达式项‘?’”,位于第三个问号后面,以及“应该有分号”,位于其后。如果你加入一个空格,使它变成?? ?,你会在同样的[相对]位置得到相同的两个错误。这本质上是用户168715在原问题的评论中提到的“最大混淆”原则。 - P Daddy

0
I think C# will use ? :

你是指在同一行中使用三个问号吗?

var a = true ? new Nullable<int>(1) ?? 1 : 0;

编辑:据我所知,在任何版本的C#中都不可能写???


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接