Printf: param transmit by lvalue and by rvalue - C (СИ)
Формулировка задачи:
Привет!
Если заменить на , то вместо h будет всегда нуль! Почему так происходит?
int output( DN2_INT const * const ss, tm const * const tm_info_ptr, bool reversed, bool quit ) { int _ss = *ss; int m = tm_info_ptr->tm_min; int h = tm_info_ptr->tm_hour; int s = tm_info_ptr->tm_sec; if ( tm_info_ptr && ss ) { if ( !reversed ) printf( "%d sekund je %d ur, %d minut, %d sekund\n", _ss, h, m, s ); else printf( "%d ura, %d minut, %d sekund je %d sekund\n", h, m, s, _ss ); } if ( quit ) { getchar( ); exit( 0 ); } }
printf( "%d sekund je %d ur, %d minut, %d sekund\n", _ss, h, m, s );
printf( "%d sekund je %d ur, %d minut, %d sekund\n", *ss, h, m, s );
Решение задачи: «Printf: param transmit by lvalue and by rvalue»
textual
Листинг программы
~/samples$ uname -m x86_64 ~/samples$ cat foo.c #include <stdio.h> void foo(long* val) { printf("%d", *val); } void bar(long* val) { int x = *val; printf("%d", x); } ~/samples$ gcc -O2 -S foo.c foo.c: В функции «foo»: foo.c:5:2: предупреждение: format «%d» expects argument of type «int», but argument 2 has type «long int» [-Wformat] ~/samples$ clang -O2 -S foo.c foo.c:5:11: warning: conversion specifies type 'int' but the argument has type 'long' [-Wformat] printf("%d", *val); ~^ ~~~~ %ld 1 warning generated. ~/samples$
Объяснение кода листинга программы
- В данном коде представлены две функции: foo и bar.
- Обе функции принимают аргумент типа long*.
- Внутри функции foo происходит вывод значения аргумента через функцию printf с форматом
%d
. - Внутри функции bar происходит следующее:
a. Значение аргумента приводится к типу int с помощью оператора (*val) в качестве выражения rvalue.
b. Результат приведения типов сохраняется в переменной x.
c. Выводится значение переменной x через функцию printf с форматом
%d
. - Предоставлен результат выполнения команды gcc -O2 -S foo.c: a. Ошибка компиляции с предупреждением формата.
- Предоставлен результат выполнения команды clang -O2 -S foo.c: a. Ошибка компиляции с предупреждением формата.
- Необходимо добавить спецификатор формата '%ld' для вывода значения типа long.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д