pg474,KNKing
"C99中的一般规则是,如果特定文件中函数的所有顶级声明都包含内联而非外部,那么该文件中函数的定义是内联的."
"如果函数在程序中的任何地方使用(包括包含其内联声明的文件),那么函数的外部声明将需要由其他文件提供.当调用该函数时,编译器可以选择执行一个普通的调用(使用函数的外部定义)或执行内联扩展(使用函数的内联定义).无法确定编译器将做出哪个选择,因此两个定义保持一致至关重要."
"具有静态存储持续时间的变量是具有外部链接的内联函数的特殊问题"
但我认为你无法通过外部链接调用函数!编译器会给出一个错误:
第473页
"所以试图从另一个文件中调用平均值将被视为错误"
"因此,C99对具有外部链接的内联函数施加了以下限制(但不对具有内部链接的内联函数):该函数可能未定义可修改的静态变量.该函数可能不包含对具有内部链接的变量的引用."
为什么??如果函数是内联函数和外部函数,那么即使它确实声明了一个静态int i; 由于函数无法链接到你无法调用它,但是不会在内联函数堆栈框架外创建静态变量 - 所以你应该能够链接到它?内联函数有堆栈框架吗?这里发生了什么??
在阅读这个问题时,我打开我的编辑器尝试一些代码示例来验证和理解它。以下是我的代码:
public enum EnumImpl {
B {
public void method() {
System.out.println(s); //(1)non-static variable s cannot be referenced from a static context
}
public static int b; //(2)Illegal static declaration in inner class
};
private int s;
}
Run Code Online (Sandbox Code Playgroud)
但是编译上面的代码让我更加困惑。
B
实际上属于静态类。所以在 中method
,它是一个静态上下文。嵌套的枚举类型是隐式静态的。
以下是B的匿名合成类的字节码:
final class enum_type.EnumImpl$1 extends enum_type.EnumImpl {
enum_type.EnumImpl$1(java.lang.String, int);
Code:
0: aload_0
1: aload_1
2: iload_2
3: aconst_null
4: invokespecial #1 // Method enum_type/EnumImpl."<init>":(Ljava/lang/String;ILenum_type/EnumImpl$1;)V
7: …
Run Code Online (Sandbox Code Playgroud)我有一个简单的流,如下所示:
List<Long> r = l.stream()
.filter(a->a.getB() % 2 == 0)
.map(A::getB)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但 Intellij 建议我:
'filter()' 和 'map()' 可以交换检查信息:报告可以简化的流 API 调用链。它允许在遍历集合时避免创建冗余的临时对象。例如
- collection.stream().forEach() ?集合.forEach()
- collection.stream().collect(toList/toSet/toCollection()) ? 新的集合类型<>(集合)
Intellij 给出的例子很容易理解,但我不明白为什么它建议我map().filter()
.
我查看了来源ReferencePipeline
但没有发现任何线索:map().filter()
或者filter().map()
在与流实现相关的临时对象方面没有区别(filter().map()
如果A.b
是一个让我更加困惑的原语,那么自动装箱会更少)。
那么,我是否缺少流实现的某些点,或者这是 Intellij 的误报?
我运行以下代码并获得评论中显示的结果.我知道之间的差异==
和.equals()
.我不明白的是为什么我的第二行代码与第三行代码的结果不同.
String de = "de";
// String abcde = "abc" + "de"; // abcde == "abcde" reture true
String abcde = "abc" + de; // abcde == "abcde" reture false;
System.out.println();
System.out.println(abcde=="abcde");
System.out.println(de=="de");
Run Code Online (Sandbox Code Playgroud)
在尝试调试时,我使用了javap -c命令并为第一个字符串连接获得了以下输出'code':
Code:
0: ldc #9; //String de
2: astore_1
3: new #10; //class java/lang/StringBuilder
6: dup
7: invokespecial #11; //Method java/lang/StringBuilder."<init>":()V
10: ldc #4; //String abc
12: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
String;)Ljava/lang/StringBuilder;
15: aload_1
16: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
String;)Ljava/lang/StringBuilder;
19: invokevirtual …
Run Code Online (Sandbox Code Playgroud) 为了找到getline()
面对EOF 的行为,我写了以下测试:
int main (int argc, char *argv[]) {
size_t max = 100;
char *buf = malloc(sizeof(char) * 100);
size_t len = getline(&buf, &max, stdin);
printf("length %zu: %s", len, buf);
}
Run Code Online (Sandbox Code Playgroud)
而input1是:
abcCtrl-DEnter
结果:
length 4: abc //notice that '\n' is also taken into consideration and printed
Run Code Online (Sandbox Code Playgroud)
输入2:
abcEnter
完全相同的输出:
length 4: abc
Run Code Online (Sandbox Code Playgroud)
似乎EOF
被遗漏了getline()
所以我发现它的源代码getline()
和后续内容是它的一个相关片段(我省略了一些注释和不相关的代码以简洁):
while ((c = getc (stream)) != EOF)
{ …
Run Code Online (Sandbox Code Playgroud) #include<iostream>
using namespace std;
int main()
{
char test[10];
char cont[10];
cin.getline(test,10);
cin.getline(cont,10);
cout<<test<<" is not "<<cont<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我输入:
12345678901234567890
输出是:
123456789
这似乎cont
是空的.有人可以解释一下吗?
ps -ef
在我的机器上执行时,我发现一个非常奇怪/特殊的命令行参数chrome
:
501 536 493 0 ?11?? ?? 13:11.48 /Applications/Google Chrome.app/Contents/Versions/69.0.3497.100/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper --type=gpu-process --field-trial-handle=3535656472344341962,3817030915272013891,131072 --gpu-preferences=KAAAAAAAAACAAAAAAQAAAAAAAAAAAGAAAAAAAAAAAAAIAAAAAAAAADgBAAAmAAAAMAEAAAAAAAA4AQAAAAAAAEABAAAAAAAASAEAAAAAAABQAQAAAAAAAFgBAAAAAAAAYAEAAAAAAABoAQAAAAAAAHABAAAAAAAAeAEAAAAAAACAAQAAAAAAAIgBAAAAAAAAkAEAAAAAAACYAQAAAAAAAKABAAAAAAAAqAEAAAAAAACwAQAAAAAAALgBAAAAAAAAwAEAAAAAAADIAQAAAAAAANABAAAAAAAA2AEAAAAAAADgAQAAAAAAAOgBAAAAAAAA8AEAAAAAAAD4AQAAAAAAAAACAAAAAAAACAIAAAAAAAAQAgAAAAAAABgCAAAAAAAAIAIAAAAAAAAoAgAAAAAAADACAAAAAAAAOAIAAAAAAABAAgAAAAAAAEgCAAAAAAAAUAIAAAAAAABYAgAAAAAAABAAAAAAAAAAAAAAAAUAAAAQAAAAAAAAAAAAAAALAAAAEAAAAAAAAAAAAAAADAAAABAAAAAAAAAAAAAAAA0AAAAQAAAAAAAAAAAAAAAPAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAABIAAAAQAAAAAAAAAAAAAAATAAAAEAAAAAAAAAABAAAABQAAABAAAAAAAAAAAQAAAAsAAAAQAAAAAAAAAAEAAAAMAAAAEAAAAAAAAAABAAAADQAAABAAAAAAAAAAAQAAAA8AAAAQAAAAAAAAAAEAAAAQAAAAEAAAAAAAAAABAAAAEgAAABAAAAAAAAAAAQAAABMAAAAQAAAAAAAAAAQAAAAFAAAAEAAAAAAAAAAEAAAACwAAABAAAAAAAAAABAAAAAwAAAAQAAAAAAAAAAQAAAANAAAAEAAAAAAAAAAEAAAADwAAABAAAAAAAAAABAAAABAAAAAQAAAAAAAAAAQAAAASAAAAEAAAAAAAAAAEAAAAEwAAABAAAAAAAAAABgAAAAUAAAAQAAAAAAAAAAYAAAALAAAAEAAAAAAAAAAGAAAADQAAABAAAAAAAAAABgAAAA8AAAAQAAAAAAAAAAYAAAAQAAAAEAAAAAAAAAAGAAAAEgAAABAAAAAAAAAABgAAABMAAAAQAAAAAAAAAAcAAAAFAAAAEAAAAAAAAAAHAAAACwAAABAAAAAAAAAABwAAAA0AAAAQAAAAAAAAAAcAAAAPAAAAEAAAAAAAAAAHAAAAEAAAABAAAAAAAAAABwAAABIAAAAQAAAAAAAAAAcAAAATAAAA --service-request-channel-token=17030867567105907743
Run Code Online (Sandbox Code Playgroud)
出于好奇,我发现的来源chromium
似乎很正常:
namespace gl {
// On dual-GPU systems, expresses a preference for using the integrated
// or discrete GPU. On systems that have dual-GPU support (see
// GpuDataManagerImpl), resource sharing only works between
// contexts that are created with the same GPU preference.
//
// This API will likely need to be adjusted as the …
Run Code Online (Sandbox Code Playgroud) 我试图在Java 6中实现这一点:
abstract class CurrClass{
public <T extends CurrClass> T setField (String str) {
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨错误:Type mismatch: cannot convert from CurrClass to T.
添加演员作品,并附上警告:"return (T) this;"
有没有更清晰的语法来做到这一点?为什么演员需要?
我的主要问题是在设置时使用以下代码JFrame
:
为什么面板不显示我是否使用它pack()
以及如何使其工作?
为什么第一个requestFocusInWindow()
不起作用,使用它的原理是什么?
JPanel
如果我删除了默认布局管理器为什么不起作用setLayout()
?
public class SoundGUI extends KeyAdapter{
public static void main(String[] args) {
SoundGUI sGUI = new SoundGUI();
sGUI.setUp();
}
public void setUp () {
JFrame frame = new JFrame ("Key test");
frame.setSize (1000, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible (true);
Panel p = new Panel ();
p.setLayout(new BorderLayout());//why this sentence is necessary FlowLayout doesn't fill the container but rather lets components size to their preferredSizes.
p.addKeyListener (this);
p.requestFocusInWindow();//it's useless here
//requestFocus …
Run Code Online (Sandbox Code Playgroud) 我已经在linux服务器6.5上安装了nexus 2.8.1-01,但是当我尝试启动时它得到了以下结果.有人会帮助我吗?
[uszbwp6 @ ANV-WFM-DLAPP01 nexus-2.8.1-01] $ ./bin/nexus start`
启动Nexus OSS ...无法启动Nexus OSS.
谢谢,鲍勃