我很难理解C中数组名称的类型和用法.这可能看起来很长,但请耐心等待.
我理解以下语句声明a
是类型,int []
即整数数组.
int a[30];
Run Code Online (Sandbox Code Playgroud)
同时a
也指出数组的第一个元素和类似*(a+2)
的东西是有效的.因此,a
看起来像一个指向整数的指针.但实际上类型int []
和int*
不同; 前者是数组类型,后来是指向整数的 指针.
类型int []
变量int*
在传递给函数时也会转换为类型变量; 因为C
数组是通过引用传递的(sizeof
运算符除外).
这就是让我垂涎的观点.看看下面这段代码:
int main()
{
int (*p)[3];
int a[3] = { 5, 4, 6 };
p = &a;
printf("a:%d\t&a:%d\n",a,&a);
printf("%d",*(*p + 2));
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
a:2686720 &a:2686720
6
Run Code Online (Sandbox Code Playgroud)
那么,上面的代码是如何工作的呢?我有两个问题:
a
并&a
具有相同的值.为什么?int (*p)[3];
做什么的?它声明了一个 …好的,我听说你应该把一个指针指向一个普通的指针,即void *
在打印它之前,必须练习使用%p
占位符而不是%d
在printf
打印它们的函数中.
我只是觉得可以在打印时防止截断大地址,或者是其他什么?但关键是如果你在一台64位指针和32位整数的机器上; 使用%p
而不是%d
将完成这项工作.
有人知道这种铸造技术有用的任何实际情况吗?
我可以在所需的布尔上下文中使用python对象吗?默认情况下,任何对象都True
在布尔上下文中.
>>> class Person():
... pass
...
>>> a=Person()
>>> bool(a)
True
Run Code Online (Sandbox Code Playgroud)
像bool(0)
返回False
和bool(1)
返回一样True
.我可以用任何方式定义一个对象,使其具有布尔值True
或者False
.如果我在任何地方都错了,请纠正我,谢谢.
为什么大多数C的实现都允许以下行为?如果我们使用变量本身来定义它,就像这样:
#include <stdio.h>
int main()
{
int a = 9;
int b = ( a +b );
printf("%d",b);
}
Run Code Online (Sandbox Code Playgroud)
我知道将使用垃圾值,b
但应该有一些编译时警告.这对我来说听起来有点奇怪.在像Python这样的语言中,执行这样的操作是违法的:
>>> b = 9
>>> a = a + b
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
a = a + b
NameError: name 'a' is not defined
Run Code Online (Sandbox Code Playgroud)
我想Python不会将变量放到当前的命名空间,直到它定义良好(即它在当前范围内有一个值),而在C中,上面的语句断开如下:
int b = 9;
int a; // put to namespace or whatever a lookup table with garbage value
a = a …
Run Code Online (Sandbox Code Playgroud) 我真的不习惯使用docker VOLUME了.我有一个普通的dockerfile:
FROM ubuntu:latest
VOLUME /foo/bar
RUN touch /foo/bar/tmp.txt
Run Code Online (Sandbox Code Playgroud)
我跑了$ docker build -f dockerfile -t test .
,它成功了.在此之后,我以交互方式将shell运行到与创建的test
映像的运行相关联的docker容器中.就是这样,我跑了$ docker run -it test
观察:
/foo/bar
已创建但为空.
docker inspect test
安装信息:
"Volumes": {
"/foo/bar": {}
}
Run Code Online (Sandbox Code Playgroud)
它似乎根本没有安装.这项任务看起来很顺利,但我做错了吗?
编辑:我希望持久保存在此已装入的卷目录中创建的数据.
我是Java初学者,并且知道try...catch
语句用于处理异常; 表示当try
块抛出异常时,catch
执行块.所以,我的问题是,当我尝试下面的代码(没有try catch
)它抛出一个未报告IOException
的read()
方法,但当我使用 try catch
它工作正常.
当try
块中出现上述异常并exception occured
打印时,为什么控件不会转移到catch语句?这是我的代码:
class Test00 {
public static void main(String args[]) {
char ch;
try {
ch=(char)System.in.read();//here exception is thrown without using try..catch
System.out.println(ch);
} catch(Exception e) {
System.out.print("exception occured");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为编译器会抛出一个异常,这就是代码与try catch一起工作的原因.但是为什么不执行catch块呢?我得错了.
好的,这是一个简单的程序代码我试图编写实现功能的atoi
功能.困扰我的是我无法更改块中的dummy
变量,if
而我可以更改n
变量.n
并且dummy
在同一范围内定义.
int main()
{
char *s;
puts("Enter a string");
fgets(s,100,stdin);
int n = 0 , dummy = 1; // both are defined in the same scope
for(int i = 0 ; i < 2 ; i++ )
{
if(isdigit( s[i] )) { n = n*10 + (s[i] - '0'); }
if(1)
{
dummy = dummy + 99; // This is the thing not working , program stops executing …
Run Code Online (Sandbox Code Playgroud) 我通常会声明并初始化一个整数数组,如下所示:
int a[3] = { 1, 2, 3}; // declares an array of 3 integers
Run Code Online (Sandbox Code Playgroud)
但今天我发现将列表括在括号中,如下所示:
int a[3] = ( { 1, 2, 3} ); // gives compile time error
Run Code Online (Sandbox Code Playgroud)
这产生了以下编译器错误:
expected ';' before '}' token
invalid initializer
Run Code Online (Sandbox Code Playgroud)
当然,人们通常没有理由将列表括在括号中,但现在我很好奇 - 为什么我们不能在这里使用括号?
c ×5
arrays ×2
pointers ×2
python ×2
docker ×1
dockerfile ×1
exception ×1
java ×1
oop ×1
printf ×1
python-2.7 ×1
python-3.x ×1