char arr[] = "Hello";
arr = arr + 1; // error occurs
Run Code Online (Sandbox Code Playgroud)
据我所知,具有数组类型的表达式将转换为指向数组初始元素的指针类型.因此,我期望arr = arr + 1(指向数组的第一个元素(arr)的指针成为指向数组的第二个元素的指针).为什么这不适用于C?
根据ISO C11 - 6.5.16.3,它说
- 赋值运算符将值存储在左操作数指定的对象中.赋值表达式在赋值后具有左操作数的值,但不是左值.赋值表达式的类型是左值操作数在左值转换后将具有的类型.在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序.对操作数的评估是不确定的.
所以我想这意味着,例如,
int x = 10;
x = 5 + 10;
Run Code Online (Sandbox Code Playgroud)
x计算为10,右操作数计算为15.x.但是如果赋值的目的是存储右操作数的evalauted值(就像在step2中那样),为什么左操作数的评估是必要的?评估左操作数有什么意义?
我正在阅读C Primer Plus中关于命令行参数的一节argv,我很难理解这句话.
它说,
程序将命令行字符串存储在内存中,并将每个字符串的地址存储在指针数组中.该数组的地址存储在第二个参数中.按照惯例,
argv对于参数值,将调用指向指针的指针.
这是否意味着命令行字符串作为指向数组的指针数组存储在内存中char?
我们说表达"评估"值和语句命令计算机"执行".但对我来说,似乎是相同的术语.C中的执行和评估有什么区别?
据我所知,derefence运算符*返回存储在指针地址中的值.我感到困惑的是当操作符与数组的指针一起使用时的行为.例如,
int a[4][2];
Run Code Online (Sandbox Code Playgroud)
然后a在内部转换为2个整数的4个元素的数组的第一个元素的指针.然后*a返回哪个值?我真的很困惑!
我对sizeofC中的运算符感到困惑.
#include <stdio.h>
int main(void)
{
char num1=1, num2=2, result;
result = num1 + num2;
printf("Size of result: %d \n",sizeof result);
printf("Size of result: %d \n",sizeof(num1+num2));
}
Run Code Online (Sandbox Code Playgroud)
结果分别为1和4.为什么会这样?
例如,
int x = 10;
Run Code Online (Sandbox Code Playgroud)
然后将值10保存在内存中的某个位置.我听说过"指向int对象的指针",但我从未听说过"指向对象类型的指针".这是否意味着10存储的对象保存有关存储在对象中的值类型的信息,"指向对象类型的指针"的值显示此信息存储在内存中的位置?
例如,
int x[10];
int i = 0;
x = &i; //error occurs!
Run Code Online (Sandbox Code Playgroud)
根据C - A参考手册,数组名称不能是左值.因此,x不能是左值.但是,数组名称不能是左值的原因是什么?例如,为什么第三行发生错误?
例如,有一个名为"Hello.txt"的文本文件
Hello World!
然后操作系统(我使用MS-DOS)如何识别此文本文件的结尾?在'!'之后隐藏某种字符或符号 哪个表示文件结束?
我正在阅读"C Primer Plus"中的一个部分,它处理文件,流和键盘输入.作者将流的概念与文件连接起来,并按如下方式定义流:
从概念上讲,C程序处理流而不是直接处理文件.流是实际输入或输出映射到的理想化数据流.这意味着具有不同属性的各种输入由具有更均匀属性的流表示.然后打开文件的过程变为将流与文件相关联,并且通过流进行读取和写入
作者用粗体句来表示什么?文件和流之间的联系是什么?
我正在阅读Bill Lubanovic的“ Python简介”,它说
像zip()一样,range()返回一个可迭代的对象,
但这不是不正确的说法吗?例如,
s= zip([1,2,3],['one','two','three'])
next(s)
>> (1,'one')
next(s)
>> (2,'two')
a = range(10)
next(a)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-54-7b3ad3809256> in <module>()
1 a = range(10)
----> 2 next(a)
TypeError: 'range' object is not an iterator
Run Code Online (Sandbox Code Playgroud)
从上面的代码中,我们可以检查zip()返回的是迭代器而不是可迭代的对象。
我对C中的转换说明符有疑问.
在第5句中,如果我使用%lf或%Lf代替%f,则不会发生错误.但是,如果我使用,为什么会发生错误%f?
#include <stdio.h>
int main(void)
{
long double num;
printf("value: ");
scanf("%f",&num); // If I use %lf or %Lf instead of %f, no error occurs.
printf("value: %f \n",num);
}
Run Code Online (Sandbox Code Playgroud) 例如,
int x = 10;
*(&x) = 20;
printf("%d \n",x); // output is 20
Run Code Online (Sandbox Code Playgroud)
根据ISO C11-6.5.3.2第4段,它说
一元*运算符表示间接.如果操作数指向函数,则结果是函数指示符; 如果它指向一个对象,则结果是指定该对象的左值.如果操作数的类型为''指向类型'',则结果的类型为''type''.如果为指针分配了无效值,则unary*运算符的行为未定义.
由于操作数&x既不是函数指示符也不是对象指示符(它是指向int类型的指针),我期望未定义的行为,但它工作正常!我错过了什么?