if (condition) { /* do something */ }
else { /* do something */ }
if (condition)
/* do something */
else
/* do something */
Run Code Online (Sandbox Code Playgroud)
有人告诉我,第一个例子并不是一个好主意.我不知道这是否真的是这种情况(或者对于第二种情况); 是不是缩短了打字数量?或者是因为它只是弄得一团糟?
以下编译:
static int foo() { return 1; }
int foo();
Run Code Online (Sandbox Code Playgroud)
但是,它会一直编译吗?这种情况下的行为是否定义得很好?当非静态原型遵循静态声明时,它意味着什么?
你看,我自学了C++(不完全,我还在拖延-_-).所以,现在我开始上大学,他们正在教C,他们让我们做了一个输入四个整数的程序,我们必须告诉它们中最大和最小的.简单,不是吗?
问题是,我已经对函数和数组有了很好的理解.是的,我可以在阵列中编程,没问题.但由于这是第一个实验室,我们还没有"学到"那个,所以我不能使用其中的任何一个,它就会非常简单.
这就是我在那里写的(某种程度上感觉不对).
#include<stdio.h>
int main(void)
{
int first, second, third, fourth;
printf("Enter four integers (separated by space): ");
scanf("%d %d %d %d", &first, &second, &third, &fourth);
if((first>second) && (first>third) && (first>fourth))
printf("\nFirst number is largest");
else if((second>first) && (second>third) && (second>fourth))
printf("\nSecond number is largest");
else if((third>second) && (third>first) && (third>fourth))
printf("\nThird number is largest");
else if((fourth>second) && (fourth>third) && (fourth>first))
printf("\nFourth number is largest");
if((first<second) && (first<third) && (first<fourth))
printf("\nFirst number is smallest");
else if((second<first) && (second<third) && …Run Code Online (Sandbox Code Playgroud) 我创建了一个2D数组,并尝试打印某些值,如下所示:
int a[2][2] = { {1, 2},
{3, 4}};
printf("%d %d\n", *(a+1)[0], ((int *)a+1)[0]);
Run Code Online (Sandbox Code Playgroud)
输出是:
3 2
Run Code Online (Sandbox Code Playgroud)
我理解为什么3是第一个输出(a+1指向第二行,我们打印它的0th元素.
我的问题是关于第二个输出,即2.我的猜测是,由于类型转换a为int *,所述2D阵列像一维数组进行处理,并且因此a+1充当指向2nd元素,所以我们得到的输出作为2.
我的假设是正确的还是背后还有其他一些逻辑?
另外,原来什么是a被当作指针int (*)[2]或int **?的类型?
有一个众所周知的模式来计算数组长度:
int arr[10];
size_t len = sizeof(arr) / sizeof(arr[0]);
assert(len == 10);
Run Code Online (Sandbox Code Playgroud)
此模式适用于静态数组和常量大小的自动数组.它也适用于C99中的可变长度数组.
我想应用类似的想法来计算动态数组大小(以字节为单位):
size_t known_len = 10;
int *ptr = malloc(known_len * sizeof(int));
size_t size = known_len * sizeof(ptr[0]);
assert(size == known_len * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
这比known_len * sizeof(int)因为sizeof(ptr[0])没有引用实际的数组元素类型更好.因此,它不需要代码的读者知道类型.
然而,我不清楚表达是否sizeof(ptr[0])会导致不确定的行为.随着它扩大:
sizeof(ptr[0]) -> sizeof(*((ptr) + (0))) -> sizeof(*ptr)
Run Code Online (Sandbox Code Playgroud)
如果ptr是,结果表达式是有问题的0:
sizeof(*((int*) 0))
Run Code Online (Sandbox Code Playgroud)
根据C99标准:
(C99,6.3.2.3p3):"带有值的整型常量表达式
0,或者这种表达式转换为类型void *,称为空指针常量." 取消引用空指针是未定义的行为.(C99,6.5.3.2.p4)"如果为指针分配了无效值,则一元运算
*符的行为未定义.87)"87):"一元运算
*符解除引用指针的无效值中有一个空指针,一个与指向的对象类型不一致的地址,以及一个对象在其生命周期结束后的地址."
但是从未指明这种表达式的sizeof是否会导致未定义的行为.实际上,应该在编译时评估这样的sizeof.
我的问题是:
sizeof(ptr[0])当类型ptr已知并且值ptr …系统调用如何工作?
系统调用期间会发生什么操作?
有各种各样的系统调用open , read, write, socket等我想知道他们一般如何工作?
我有一个C代码:
char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;
Run Code Online (Sandbox Code Playgroud)
它回来了
20 8
Run Code Online (Sandbox Code Playgroud)
我想知道8是怎么来的,谢谢!
C99§6.5 表达式
(1)表达式是操作符和操作数的序列,其指定值的计算,或指定对象或函数,或者生成副作用,或执行其组合.
(2)在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的评估来修改一次.72)此外,先前值应只读以确定要存储的值.73)
用脚注
72)浮点状态标志不是对象,可以在表达式中多次设置.
73)此段落呈现未定义的语句表达式,如
Run Code Online (Sandbox Code Playgroud)i = ++i + 1; a[i++] = i;允许的同时
Run Code Online (Sandbox Code Playgroud)i = i + 1; a[i] = i;
C11§6.5改为((1)的文本有附录):
(1)[...]运算符的操作数的值计算在运算符的结果的值计算之前被排序.
(2)如果对标量对象的副作用相对于对同一标量对象的不同副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义.如果表达式的子表达式有多个允许的排序,则如果在任何排序中发生这种未测序的副作用,则行为是不确定的.84)
C11中的脚注84与C99中的73相同.
我有点困惑......我把C11(2)读作"[...](对同一标量对象的不同副作用)或(使用相同标量对象的值进行值计算)[...]"似乎甚至不允许foo = ++i(有副作用,我们根据更改的对象使用值).不过,我不是母语人士,所以如果能告诉我这句话应该如何"解析"会更好.我理解C99,但我不太明白C11的措辞.
无论如何,实际问题:这是从C99到C11的变化,还是这些措辞相当?如果是这样,为什么它会被改变?如果没有,有人可以给出一个表达式的例子,这个表达式在C99中是UB而在C11中不是,反之亦然?
维基说:
的
extern关键字的意思是"没有限定声明".换句话说,它是一种显式声明变量或强制声明而无需定义的方法.也可以明确定义变量,即强制定义.这是通过为变量分配初始化值来完成的.
这意味着,初始化变量的extern声明用作该变量的定义.所以,
/* Just for testing purpose only */
#include <stdio.h>
extern int y = 0;
int main(){
printf("%d\n", y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
应该是有效的(在C++ 11中编译).但是当使用-Wall -Wextra -pedantic -std=c99GCC 4.7.2中的选项进行编译时,会产生警告:
[Warning] 'y' initialized and declared 'extern' [enabled by default]
Run Code Online (Sandbox Code Playgroud)
哪个不应该.据我所知,
extern int y = 0;
Run Code Online (Sandbox Code Playgroud)
实际上是一样的
int i = 0;
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题?
我只是编写一个程序来计算整数的幂.但产量不如预期.除了5的幂之外,它适用于所有整数.
我的代码是:
#include <stdio.h>
#include <math.h>
int main(void)
{
int a,b;
printf("Enter the number.");
scanf("\n%d",&a);
b=pow(a,2);
printf("\n%d",b);
}
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
"Enter the number. 2
4
"Enter the number. 5
24
"Enter the number. 4
16
"Enter the number. 10
99
Run Code Online (Sandbox Code Playgroud)
我们不能使用pow()int数据类型的函数??
c ×10
c99 ×3
arrays ×2
c++ ×1
c11 ×1
coding-style ×1
extern ×1
function ×1
gcc-warning ×1
initializer ×1
linkage ×1
output ×1
php ×1
pointers ×1
pow ×1
process ×1
sizeof ×1
static ×1
system-calls ×1