草庐IT

java - 'T.super' 是 JLS 的合法表达吗?

考虑以下一组表达式:classT{{/*1*/Objecto=T.super;//error:'.'expected/*2*/o.toString();}}尝试编译它会在/*1*/行失败并出现错误:error:'.'expectedo=T.super;^同时使用OpenJDK1.8.0(Ubuntu)或OracleJDK1.8(Windows)。但是,Eclipse4.5.0(Mars)编译没有任何错误,结果是:classT{T();0aload_0[this]1invokespecialjava.lang.Object()[8]//super()4aload_0[this]5asto

java - 为什么在某些情况下重新抛出 Throwable 而不声明它是合法的?

我希望以下代码在throwt;上引发编译时错误,因为main未声明为抛出Throwable,但它编译成功(在Java1.7.0_45中),并且如果编译时错误得到修复,它会产生您期望的输出。publicclassTest{publicstaticvoidmain(String[]args){try{thrownewNullPointerException();}catch(Throwablet){System.out.println("Caught"+t);throwt;}}}如果Throwable更改为Exception也会编译。这并没有像预期的那样编译:publicclassTest

java - 为什么同名静态方法的静态导入是合法的?

假设我们有这些包和类:packagep1;publicclassA1{publicstaticvoida(){}}packagep2;publicclassA1{publicstaticvoida(){}}packagep3;importstaticp1.A1.a;importstaticp2.A1.a;publicclassA1{publicstaticvoidtest(){}}我想知道,为什么p3包中方法的静态导入是合法的(不会导致编译时错误)?我们将无法在test()方法中进一步使用它们,因为这样使用会导致编译时错误。为什么它与普通的类导入不同。假设我们想将p1和p2包中的类A1

java - 1/0 是合法的 Java 表达式吗?

以下在我的Eclipse中编译得很好:finalintj=1/0;//compilesfine!!!//throwsArithmeticException:/byzeroatrun-timeJava从一开始就阻止了许多“愚蠢的代码”(例如"Five"instanceofNumber无法编译!),所以事实上这甚至没有生成一个警告让我非常惊讶。当您考虑允许在编译时优化常量表达式这一事实时,这种阴谋就会加深:publicclassDiv0{publicstaticvoidmain(String[]args){finalinti=2+3;finalintj=1/0;finalintk=9/2;

PHP:$this->something->($this->foo)->bar 合法吗?

这行PHP合法吗?$this->mongo->($this->db)->$collection_name->insert($document_name);如果$this->db是一个带有要使用的db名称的常量。谢谢 最佳答案 尝试使用花括号代替括号:$this->mongo->{$this->db}->$collection_name->insert($document_name);或者将$this->db分配给本地变量并使用它来代替:$db_name=$this->db;$this->mongo->$db_name->$colle

c++ - C++11 中的空宏参数合法吗?

我有时会故意省略宏参数。例如,对于类似函数的宏,如#defineMY_MACRO(A,B,C)...我可以这样调用它:MY_MACRO(,bar,baz)技术上仍有3个参数;只是第一个是“空的”。这个问题与可变参数宏无关。当我这样做时,我会在使用-ansi进行编译时收到来自g++的警告。(又名-std=c++98),但当我使用-std=c++0x时不会.这是否意味着空宏参数在新的C++标准中是合法的?这就是我的全部问题,但期待“你为什么要这样做?”回应,这是一个例子。我喜欢保持.h文件不受函数体的干扰,但是在.h文件之外实现简单的访问器是乏味的。因此,我编写了以下宏:#defineIM

c++ - 为什么 'int i = i;' 合法?

这个问题在这里已经有了答案:关闭10年前.PossibleDuplicate:intvar=1;voidmain(){inti=i;}以下代码在g++和VisualC++下都可以通过编译。为什么是合法的?看起来不合理,可能会导致隐藏的bug。intmain(){inti=i;} 最佳答案 编辑:它在语法上是合法的,但如果你使用x会导致未定义的行为。这是不合法的,因为您将一个未初始化的变量分配给另一个(嗯,相同的)未初始化的变量。仅仅因为它编译并不意味着它是合法的。这是有效的C++语法,是的,但不合法。赋值运算符的右侧必须在赋值时进行

c++ - 为什么将 "pointer to pointer to non-const"转换为 "pointer to pointer to const"是不合法的

将指向非常量的指针转换为指向常数的指针是合法的。那么为什么将指向非const的指针转换为指向const的指针是不合法的呢?例如,为什么下面的代码是非法的:char*s1=0;constchar*s2=s1;//OK...char*a[MAX];//akachar**constchar**ps=a;//error! 最佳答案 来自标准:constcharc='c';char*pc;constchar**pcc=&pc;//notallowed*pcc=&c;*pc='C';//wouldallowtomodifyaconstobjec

c++ - 覆盖 std::string 空终止符合法吗?

在C++11中,我们知道std::string保证是连续的和空终止的(或者更迂腐,由charT()终止,在char的情况下是空字符0)。我需要使用这个CAPI来通过指针填充字符串。它写入整个字符串+空终止符。在C++03中,我总是被迫使用vector,因为我不能假设string是连续的或空终止的。但是在C++11中(假设有一个完全符合的basic_string类,这在某些标准库中仍然存在问题),我可以。或者我可以吗?当我这样做时:std::stringstr(length);字符串将分配length+1字节,最后一个由空终止符填充。那挺好的。但是当我把它传递给CAPI时,它会写成len

c++ - 编译器降低程序的时间复杂度是否合法?这被认为是可观察的行为吗?

(注意:这是一个language-lawyer问题;我不是指任何特定的现有编译器。)何时允许编译器降低程序的时间复杂度?在什么情况下(如果有的话)这被认为是“可观察的行为”,为什么?(例如,编译器可以合法地将多项式时间程序“减少”为指数时间程序吗?)如果答案在C和C++中不同,或者在两者的不同版本中不同,请解释差异。 最佳答案 C标准实际上并没有时间复杂度模型,无论是对于它的原始操作还是它的库函数,所以编译器可以做几乎任何事情来保留程序语义(可观察的行为)。C++标准仅为其某些库函数提供复杂性保证,并表示(17.5.1.4[stru