我正在阅读JP Mueller和J. Cogswell撰写的"C++ All-in-One for Dummies"并偶然发现:
#include <iostream>
using namespace std;
int main()
{
int ExpensiveComputer;
int CheapComputer;
int *ptrToComp;
...
Run Code Online (Sandbox Code Playgroud)
这段代码首先初始化所有涉及的东西 - 两个整数和一个指向整数的指针.
只是为了确认,这是一个错误,应该读作'......通过声明',对吧?对我来说,这样的基本错误仍然会出现在书中,这一点很奇怪.
这段代码
int a = 6;
System.out.print("The result is " + a*a);
Run Code Online (Sandbox Code Playgroud)
工作得很好,但这一个
int a = 6;
System.out.print("The result is " + a^a);
Run Code Online (Sandbox Code Playgroud)
产生例外:
线程"main"中的异常java.lang.RuntimeException:无法编译的源代码 - 错误的树类型:at pkg1.pkg4.taking.input.TakingInput.main(TakingInput.java:11)
为什么这样?
当我试图一次性打印几个按位操作的结果时出现了这个问题,如下所示:
System.out.print(a&b + "\n" + a|b + "\n" + a^b);
Run Code Online (Sandbox Code Playgroud)
我查看了print()
方法的描述和关于按位运算符的几个主题以及在SO上打印到控制台,包括编写问题时的推荐主题,但找不到答案.
我正在阅读赫伯特·希尔尔德(Herbert Schildt)的“ Java:完整参考”中有关lambda的一章,其中有很多参考“ lambda目标类型”和“目标类型上下文”:
功能接口定义lambda表达式的目标类型。这是一个关键点:lambda表达式只能在指定其目标类型的上下文中使用。
要么:
如前所述,lambda表达式不是单独执行的。相反,它形成了由指定其目标类型的功能接口定义的抽象方法的实现。结果,只能在定义目标类型的上下文中指定lambda表达式。当将lambda表达式分配给功能接口引用时,将创建这些上下文之一。其他目标类型上下文 包括变量初始化,返回语句和方法参数,仅举几例。
完后还有:
与lambda表达式关联的功能接口可以是通用的。在这种情况下,lambda表达式的目标类型部分由声明函数接口引用时指定的一个或多个类型实参确定。
有人可以帮我了解lambda目标类型的含义吗?
例如,在(int n) -> n % 2 == 0
是int
拉姆达的目标类型?
或在:
interface MyInterface<T> {
T func();
}
MyInterface<String> myInt = () -> { return "123"; }
Run Code Online (Sandbox Code Playgroud)
Lambda的目标类型是什么?是String
还是MyInterface<String>
?lambda的背景是什么?
我阅读了有关该主题的SO的几篇文章,但仍然无法完全理解这些概念。
谢谢。
在所有关于Java的书籍中,我都读到编译器以相同的方式处理所有空格并简单地忽略了额外的空格,因此最好的做法是大量使用它们来提高代码的可读性.我已经在我写过的每一个表达中找到了证据:无论是否有空格都没关系,有多少(或者我只是没注意).
最近我决定尝试运算符优先级和关联性来测试优先级表并尝试编译
int a = 2;
int b = 3;
int c = a+++b;
int d = a+++++b;
Run Code Online (Sandbox Code Playgroud)
虽然前一个陈述完美汇编,但后者产生了一个例外:
线程"main"中的异常java.lang.RuntimeException:无法编译的源代码 - 意外类型.必需:变量.发现:价值.
但是,当我添加空格:时int d = a++ + ++b
,它编译.为什么会这样?据说Java无论如何都会忽略额外的空格.(如果这很重要,我有Java 8和Netbeans IDE 8.2.)
我想这可能与解析表达式有关,但我不确定.我尝试在SO和Google上查找有关解析,空白和运算符的几个问题,但找不到明确的答案.
UPD.为了解决那些重要的"额外"的评论,而不是所有的空白:既然int c = a++ + b;
又int c=a+++b;
编译,可以说,通过类比,在int d = a ++ + ++b;
空白中也是"额外的".
我正在进行一些介绍性的C++练习,其中一个是:运行此代码后屏幕上会出现什么:
int& testMethod (int& a){
int c = a+a;
return c;
};
int main() {
int z = 5;
int* y = new int (testMethod(z));
int r = 25;
testMethod(r);
std::cout<<*y;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
testMethod
第二次调用返回的值没有被分配给变量?对于No 2,我只是想确认我对堆栈如何工作的理解,如下所示.当函数返回一个值并将值赋给变量时,计算结果首先存储在堆栈中,如retval
某些内存位置,然后分配给变量,即写入另一个内存位置.然后堆栈指针向上移动(再次,根据我的理解,当指针从最大地址移动到最小地址时,堆栈的"顶部"实际上是它的"底部").但retval
它仍然存在一段时间,直到它被另一条数据覆盖(这可能几乎立即发生).
第二个问题出现在我正在寻找关于SO的第一个问题的答案并找到了这个帖子,因为两个顶部(通过投票)的帖子回答不同.
这是我们在C++类简介中给出的另一个"重新发明轮子"的问题:
编写一个函数,返回字符串中第一次出现的字符序列的位置,即
strstr
函数的变体.
我开始编写如下函数:
int strstr2(const char *text, const char *pattern) {
int pos = 0;
char *temp;
temp = text;
}
Run Code Online (Sandbox Code Playgroud)
我以为我会记住字符串的第一个字符的地址以供将来在函数中使用,但编译器说:
"const char*"类型的值不能分配给"char*"类型的实体.
我知道一旦初始化了一个常量就不能改变它,但是为什么我不能将指向常量char的指针分配给另一个非常量指针?
我读了几个关于指针和常量的问题,看来这篇文章的接受答案的底部可能会回答我的问题,但我不是百分百肯定,因为讨论对我来说仍然处于过于先进的水平.
我的第二个问题是,解决方法是什么?如何定义指向字符串开头的指针?
谢谢.
c++ ×3
java ×3
const ×1
declaration ×1
lambda ×1
parsing ×1
pointers ×1
printing ×1
stack ×1
terminology ×1
whitespace ×1